0

嗨,我在一个包含 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  
4

3 回答 3

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调用或您想对每个文件执行的任何操作。

于 2013-10-14T13:39:52.800 回答
0

使用以下成语:

for file in *
do
    ./your_shell_script_containing_the_above.sh $file > some_unique_id
done
于 2013-10-14T13:37:05.850 回答
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:我没有尝试太多来重构您可能也可以缩短的管道命令。

于 2013-10-14T13:37:14.903 回答