私は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