我想使用 awk 和 bash 腳本自動轉換許多 csv 檔案的標題。
目前,我正在使用以下代碼塊,它作業正常:
for FILE in *.csv;
do
awk 'FNR>1{print $0}' $FILE | awk 'NR == 1{print "aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,...,zzz"}1' > OUT_$FILE
done
什么這些命令做的是,它首先從洗掉舊的頭$FILE,然后附加在前面加上一個新的逗號分隔(很長的)頭aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,...,zzz到$FILE,然后保存輸出OUT_$FILE。
目前,我正在aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,...,zzz從另一個 csv 檔案手動復制該部分并粘貼到此欄位中以替換$FILE. 雖然它正在作業,但對于許多 csv 檔案來說,它變得乏味、重復和耗時。
我沒有手動復制標題,而是嘗試從另一個 csv 檔案中提取標題new_headers.csv并保存到新變數$NEWHEAD。
NEWHEAD=$(awk 'NR==1{print $0}' new_headers.csv)
雖然我可以查看提取的標頭$NEWHEAD,但我不知道如何將此命令合并到以前的作業流中以附加前置標頭$FILE。
我當然會感謝任何解決此問題的建議。謝謝 :)
uj5u.com熱心網友回復:
使用 GNU awk 進行“就地”編輯:
awk -i inplace 'NR==1{hdr=$0} {print (FNR>1 ? $0 : hdr)}' new_headers.csv *.csv
uj5u.com熱心網友回復:
newheader=$(head -n 1 new_headers.csv)
for file in *.csv
do
{
printf '%s\n' "$newheader"
tail -n 2 "$file"
} > OUT_"$file"
done
筆記:
head -n 1輸出檔案的第一行tail -n 2輸出除第一行以外的所有行{ }是對命令進行分組,以便您將它們的輸出作為一個整體重定向
uj5u.com熱心網友回復:
您可以閱讀awk腳本內的標題,如下所示
awk '
BEGIN{
do {
h = (h) ? (h "\n" line) : line
} while ((getline line <"new_header.csv") > 0)
}
...
'
并h包含新的標題。
uj5u.com熱心網友回復:
$ awk 'NR==FNR {header=$0; next}
{print (FNR==1?header:$0) > (FILENAME".updated")}' new_header.csv other files...
從頭檔案中捕獲第一條記錄并替換其余檔案中的第一行,更新的檔案將具有后綴“.updated”。
警告購買者未測驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/420561.html
標籤:
下一篇:根據資料值啟用/禁用按鈕
