Linux

使用 AWK 命令轉換為具有相同名稱的 csv 文件

  • February 11, 2022

我正在使用這個命令來處理文本文件,我的目標是以 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

有兩種主要方法可以解決這個問題。

  1. 使用 shell 循環,在其中呼叫awk程式碼並將輸出重定向到從目前輸入文件派生的名稱,或者
  2. 使用所有文件作為參數呼叫awk一次,並將輸出輸出到腳本中適當命名的文件。請注意,這只有在您的文件少於數千個時才有可能。awk

我不會涉及這兩個中的第二個,因為我們看不到您的awk程式碼,因此無法建議其中需要更改的內容(NR例如,如果您正在使用 ,則可能必須更改為 using FNR,並且可能還需要其他更改)。


使用 shell 循環:

for pathname in /FILES/detail-*:??; do
   name=${pathname##*/}
   awk -f script.awk "$pathname" >"${name%:??}_${name##*:}.csv"
done

這裡使用的三個參數替換:

  1. ${pathname##*/}, 從路徑名中刪除目錄路徑,只留下字元串的文件名部分。
  2. ${name%:??},:name. 然後將該位與下劃線和 …
  3. ${name##*:}.csv, 刪除:文件名末尾的所有內容,並在末尾添加.csv文件名後綴。

第 2 次和第 3 次替換用於替換:文件名末尾的_以創建輸出文件名。

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