Filenames

添加列,用文件名(不帶“.csv”)填充整個列 - 對於 BaSH 中的多個文件

  • May 27, 2021

警告:絕對初學者。我需要在 .csv 文件中添加一列,其中列標題可以是“名稱”,但整個列應該完全相同——文件本身的名稱,filename. 每個文件現在只有 3 個變數,但有 2100 行。

範例:對於文件**“bcc1_45Fall_10010002.csv”**,這就是我所擁有的 -

  HUC8       YEAR    RO_MM
  10010002   1961    74.7
  10010002   1962    69.1
  10010002   1963    52.0
  10010002   1964   130.7
  10010002   1965    32.2
  10010002   1966    85.4

這就是我要的 -

 NAME                   HUC8       YEAR    RO_MM
 bcc1_45Fall_10010002   10010002   1961    74.7
 bcc1_45Fall_10010002   10010002   1962    69.1
 bcc1_45Fall_10010002   10010002   1963    52.0
 bcc1_45Fall_10010002   10010002   1964   130.7
 bcc1_45Fall_10010002   10010002   1965    32.2
 bcc1_45Fall_10010002   10010002   1966    85.4

或這個 -

 HUC8                    YEAR    RO_MM
 bcc1_45Fall_10010002    1961    74.7
 bcc1_45Fall_10010002    1962    69.1
 bcc1_45Fall_10010002    1963    52.0
 bcc1_45Fall_10010002    1964   130.7
 bcc1_45Fall_10010002    1965    32.2
 bcc1_45Fall_10010002    1966    85.4

如果我可以簡單地將“HUC8”列中的所有數據替換為filename那將是完美的。它不需要是額外的列。

我需要為數千個文件執行此操作。

如果我知道如何做第一部分,我就可以創建一個循環。但也許還有更好的方法?

我不知道從哪裡開始。

使用awkcolumn

$ awk '
 NR==1{ sub(/\.csv$/, "", FILENAME) } # remove .csv suffix from FILENAME
 NR>1{ $1=FILENAME }                  # replace the first field with filename
 1                                    # print record
' bcc1_45Fall_10010002.csv | column -t
HUC8                  YEAR  RO_MM
bcc1_45Fall_10010002  1961  74.7
bcc1_45Fall_10010002  1962  69.1
bcc1_45Fall_10010002  1963  52.0
bcc1_45Fall_10010002  1964  130.7
bcc1_45Fall_10010002  1965  32.2
bcc1_45Fall_10010002  1966  85.4

您可以在 shell 循環中執行它以將修改後的文件保存到目錄modified_files

mkdir modified_files &&
for i in *.csv; do
 awk 'NR==1{ sub(/\.csv$/, "", FILENAME) } NR>1{ $1=FILENAME }1' "$i" |
   column -t > "./modified_files/$i"
done

如果您需要替換列HUC8並且這不是第一列,請將程式碼更改為:

awk -v search='HUC8' '
 NR==1{
   for(i=1;i<=NF;i++)
     if ($i==search){ fld=i; sub(/\.csv$/, "", FILENAME); break }
 }
 NR>1{ $fld=FILENAME }
 1
' file.csv | column -t

引用自:https://unix.stackexchange.com/questions/651552