簡體   English   中英

awk在不同文件上一一執行相同的命令

[英]awk execute same command on different files one by one

嗨,我在一個包含4列的目錄中有30個txt文件。
如何在每個文件上一一執行相同的命令,然后直接輸出到不同的文件。

我正在使用的命令如下所示,但它適用於所有文件並提供單個輸出。 我想要的是一個一個地調用每個文件,然后將輸出定向到一個新文件。

start=$1  
patterns=''  
for i in $(seq -43 -14); do   
patterns="$patterns /cygdrive/c/test/kpi/SIGTRAN_Load_$(exec date '+%Y%m%d' --date="-${i} days ${start}")*"; done  
cat /cygdrive/c/test/kpi/*$patterns | sed -e "s/\t/,/g" -e "s/ /,/g"| awk -F, 'a[$3]<$4{a[$3]=$4} END {for (i in a){print i FS a[i]}}'| sed -e "s/ /0/g"| sort -t, -k1,2> /cygdrive/c/test/kpi/SIGTRAN_Load.csv  

使用以下成語:

for file in *
do
    ./your_shell_script_containing_the_above.sh $file > some_unique_id
done

您需要在所有匹配的文件上運行循環:

for i in /cygdrive/c/test/kpi/*$patterns; do
   tr '[:space:]\n' ',\n' < "$i" | awk -F, 'a[$3]<$4{a[$3]=$4} END {for (i in a){print i FS a[i]}}'| sed -e "s/ /0/g"| sort -t, -k1,2 > "/cygdrive/c/test/kpi/SIGTRAN_Load-$i.csv"
done

PS:我沒有做太多嘗試來重構您的管道命令,這些命令也可能會縮短。

像這樣

for fileName in /path/to/files/foo*.txt
do
  mangleFile "$fileName"
done

會破壞您通過遍歷提供的文件列表。 如果要像示例中那樣生成文件名模式,則可以這樣進行:

for i in $(seq -43 -14)
do
  for fileName in /cygdrive/c/test/kpi/SIGTRAN_Load_"$(exec date '+%Y%m%d' --date="-${i} days ${start}")"*
  do
    mangleFile "$fileName"
  done
done

這樣,即使可能存在更短的解決方案,代碼也仍然更具可讀性。

然后, mangleFile當然將是awk調用或您想要對每個文件執行的任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM