2013-10-14 63 views
0

您好我有一個包含4列的目錄中的30個txt文件。
如何對每個文件逐一執行相同的命令並將輸出指向不同的文件。awk在不同的文件上執行相同的命令一個接一個

我正在使用的命令如下,但其應用於所有文件並提供單一輸出。我想要的只是逐個調用每個文件並將輸出指向新文件。

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 
+0

將您的命令封裝爲一個shell並在調用N個文件時將其循環... – SriniV

回答

0

某事像這樣

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電話或任何你想要處理每個文件。

0

使用下列成語:

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

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

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:我還沒有試過很多重構你的管道也可能縮短的命令。

相關問題