5

A1 と A2 の 2 つのフォルダーがあります。これら 2 つのフォルダのファイル名とファイル数は同じです。各ファイルには 15 列あります。フォルダ 'A1' 内の各ファイルの列 6 は、フォルダ 'A2' 内の各ファイルの列 6 から基板を作成する必要があります。各ファイルの 2 列目と 6 列目 (減算後) を同じファイル名のフォルダー A3 に出力したいと思います。awkでこれを行うにはどうすればよいですか?

f1.txt file in folder A1

RAM     AA   159.03  113.3  122.9  34.78    116.3 
RAM     BB   151.24   70    122.9  142.78   66.4
RAM     CC   156.70   80    86.2   70.1     54.8


  f1.txt file in folder A2    

RAM     AA   110.05  113    122.9    34.78    116.3
RAM     BB   150.15  70     122.9    140.60   69.4 
RAM     CC   154.70  89.2   86.2     72.1     55.8


desired output

AA   0
BB  2.18
CC  -2
4

2 に答える 2

17

これを試して:

paste {A1,A2}/f1.txt | awk '{print $2,$6-$13}'

In bash:{A1,A2}/f1.txtに展開されますA1/f1.txt A2/f1.txt(これは単なるショートカットです。気にしないでください。)コマンドを
使用pasteして、ファイルを垂直方向にマージします。
ここでのawkコマンドは非常に簡単です。

于 2012-08-10T02:39:56.760 に答える
3

を使用した片道awk

awk 'FNR==NR { array[$1]=$2; next } { if ($1 in array) print $1, array[$1] - $2 > "A3/f1.txt" }' ~/A1/f1.txt ~/A2/f1.txt

最初の編集:

A1両方のディレクトリ (および)に同じ数のファイルがあり、A2ファイル名が次のようにペアになっていると仮定します。

for i in A1/*; do awk -v FILE=A3/${i/A1\//} 'FNR==NR { array[$1]=$2; next } { if ($1 in array) print $1, array[$1] - $2 > FILE }' A1/${i/A1\//} A2/${i/A1\//}; done

A3最初にディレクトリを作成する必要があります。そうしないと、エラーが発生します。

2番目の編集:

awk 'FNR==NR { array[$2]=$6; next } { if ($2 in array) print $2, array[$2] - $6 > "A3/f1.txt" }' ~/A1/f1.txt ~/A2/f1.txt

3番目の編集:

for i in A1/*; do awk -v FILE=A3/${i/A1\//} 'FNR==NR { array[$2]=$6; next } { if ($2 in array) print $2, array[$2] - $6 > FILE }' A1/${i/A1\//} A2/${i/A1\//}; done
于 2012-08-10T02:51:10.467 に答える