2013-10-14 139 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:我还没有试过很多重构你的管道也可能缩短的命令。

相关问题