您好我在一个目录中有30个txt文件,其中包含4列 如何逐个对每个文件执行相同的命令并将输出直接输出到不同的文件。
我使用的命令如下所示,但它应用于所有文件并提供单个输出。我想要的是逐个调用每个文件并将输出直接输出到新文件。
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 :(得分:0)
使用以下习语:
for file in *
do
./your_shell_script_containing_the_above.sh $file > some_unique_id
done
答案 1 :(得分: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:我没有做太多重构你可能缩短的管道命令。
答案 2 :(得分:0)
像这样
for fileName in /path/to/files/foo*.txt
do
mangleFile "$fileName"
done
将破坏您通过globbing提供的文件列表。如果要生成文件名模式,可以这样做:
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
电话或您想对每个文件做的任何事情。