0

こんにちは、4 つの列を含むディレクトリに 30 個の txt ファイルがあります。
各ファイルで同じコマンドを1つずつ実行し、出力を別のファイルに直接出力するにはどうすればよいですか。

私が使用しているコマンドは次のとおりですが、すべてのファイルに適用され、単一の出力が得られます。私が望むのは、各ファイルを 1 つずつ呼び出して、出力を新しいファイルに直接出力することだけです。

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 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 に答える
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または各ファイルでやりたいことは何でもなります。

于 2013-10-14T13:39:52.800 に答える