Filenames
添加列,用文件名(不帶“.csv”)填充整個列 - 對於 BaSH 中的多個文件
警告:絕對初學者。我需要在 .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
那將是完美的。它不需要是額外的列。我需要為數千個文件執行此操作。
如果我知道如何做第一部分,我就可以創建一個循環。但也許還有更好的方法?
我不知道從哪裡開始。
使用
awk
和column
:$ 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