2つの入力ファイルを繰り返す方法

2つの入力ファイルを繰り返す方法

私はawkを使って2つのファイルを一致させ、次にfile2とfile1の要素を掛けます。

 awk 'NR == FNR{a[$1]=$2; b[$1]=$3; next}
      /:/ || !NF{print; next}
     {print $1, $2*a[$1], $2*b[$1]}' file2 file1 > output

スクリプトは2つの入力ファイルのみを処理し、1つの出力ファイルを生成します。

私はこのスクリプトを多くの(何千もの)ファイルで使用するためにループを作りたいと思います。私はこれを試みます:

for file1 in ../mo/*e.log | 
for file2 in ../excited/*-d.log;   do
awk 'NR == FNR{a[$1]=$2; b[$1]=$3; next}
     /:/ || !NF{print; next}
     {print $1, $2*a[$1], $2*b[$1]}' "$file1" "$file2" > "${file1%e.log}f.log"
done

ファイルは互いに関連しているため、0001e.logと0001-d.log、0002e.log、0002-d.log、0002e.log、0002-d.log ...予想される出力は0001f.log、0002fです。 。 .log、0003f。ログ...

しかし、成功しませんでした。どんなアイデアがありますか?

ベストアンサー1

おそらくあなたは以下が欲しいでしょう:

set ../mo/*e.log
for file2 in ../excited/*-d.log; do
  file1=$1; shift
  awk 'NR == FNR{a[$1]=$2; b[$1]=$3; next}
       /:/ || !NF{print; next}
       {print $1, $2*a[$1], $2*b[$1]}' "$file1" "$file2" > "${file1%e.log}f.log"
done

または以下を使用してzsh

file1s=(../mo/*e.log)
file2s=(../excited/*-d.log)
for file1 file2 (${file1s:^file2s}) {
  awk 'NR == FNR{a[$1]=$2; b[$1]=$3; next}
       /:/ || !NF{print; next}
       {print $1, $2*a[$1], $2*b[$1]}' "$file1" "$file2" > "${file1%e.log}f.log"
}

上記では、2つのソートされたファイル名のリストがあり、両方のリストを同時に移動します。 inファイルとinファイルのデフォルト名を一致させるには、mo次のようにします。excited

for file1 in ../mo/*e.log; do
  basename=${file1%e.log}
  basename=${basename##*/}
  file2=../excited/$basename-d.log
  [ -f "$file2" ] || continue
  awk 'NR == FNR{a[$1]=$2; b[$1]=$3; next}
       /:/ || !NF{print; next}
       {print $1, $2*a[$1], $2*b[$1]}' "$file1" "$file2" > "${file1%e.log}f.log"
done

おすすめ記事