Linux
使用 AWK 命令轉換為具有相同名稱的 csv 文件
我正在使用這個命令來處理文本文件,我的目標是以 CSV 格式保存我的輸出。
awk -f test.awk /FILES/detail-1019:01 > detail-1019_01.csv
但問題是,我有很多文件,我不想單獨對每個文件執行我的處理命令。那麼我應該如何執行我的處理命令並將每個文件一次保存為 CSV 格式?
輸入文件名:
detail-1019:17 detail-1019:18 detail-1019:19 detail-1019:20 detail-1019:21 detail-1019:22
我想要的輸出文件名:
detail-1019_17.csv detail-1019_18.csv detail-1019_19.csv detail-1019_20.csv detail-1019_21.csv detail-1019_22.csv
你可以做
for f in /FILES/detail*; do awk -f test.awk $f > $(echo $f | sed -e 's/^\/FILES\///' -e 's/:/_/').csv; done
有兩種主要方法可以解決這個問題。
- 使用 shell 循環,在其中呼叫
awk
程式碼並將輸出重定向到從目前輸入文件派生的名稱,或者- 使用所有文件作為參數呼叫
awk
一次,並將輸出輸出到腳本中適當命名的文件。請注意,這只有在您的文件少於數千個時才有可能。awk
我不會涉及這兩個中的第二個,因為我們看不到您的
awk
程式碼,因此無法建議其中需要更改的內容(NR
例如,如果您正在使用 ,則可能必須更改為 usingFNR
,並且可能還需要其他更改)。使用 shell 循環:
for pathname in /FILES/detail-*:??; do name=${pathname##*/} awk -f script.awk "$pathname" >"${name%:??}_${name##*:}.csv" done
這裡使用的三個參數替換:
${pathname##*/}
, 從路徑名中刪除目錄路徑,只留下字元串的文件名部分。${name%:??}
,:
從name
. 然後將該位與下劃線和 …${name##*:}.csv
, 刪除:
文件名末尾的所有內容,並在末尾添加.csv
文件名後綴。第 2 次和第 3 次替換用於替換
:
文件名末尾的_
以創建輸出文件名。