5

2 つのファイル コンテンツを処理する必要があります。単一の nawk ステートメントを使用してそれを実現できるかどうか疑問に思っていました。

ファイル A の内容:

AAAAAAAAAAAA  1
BBBBBBBBBBBB  2
CCCCCCCCCCCC  3

ファイル B の内容:

XXXXXXXXXXX  3
YYYYYYYYYYY  2
ZZZZZZZZZZZ  1

$2ファイル A の (2 番目のフィールド) がファイル B の逆であるかどうかを比較したいと$2思います。$2Aと Bをどのように区別しますか$2

編集: A の最初の行の $2 (1) と B の最後の行の $2 (再び 1) を比較する必要があります。次に、A の 2 行目の $2 と B の NR-1 行目の $2 を比較します。すぐ.....

4

3 に答える 3

6

ファイルをシリアルに処理することはできawkますが、2 つのファイルを並列に処理することは容易ではありません。慎重に使用することで効果が得られる可能性がありますがgetline、「慎重に」というのが操作用語です。

この場合、単純な 2 列のファイルを使用すると、次のように使用する傾向があると思います。

paste "File A" "File B" |
awk '{ process fields $1, $2 from File A and fields $3, $4 from file B }'

2 つのファイルが適切な順序になっていることなどを確認する必要があります。

入力がより複雑な場合、これはうまく機能しない可能性がありますが、2 つのファイルからデータを分離する文字を選択してpaste -d'|' ...、パイプを使用して 2 つのレコードを分離し、ファイル A から情報としてawk -F'|' '{ ... }'読み取り、ファイルBからの情報として。$1$2

于 2011-12-15T05:39:16.697 に答える
6

あなたはこのようなことをすることができます -

[jaypal:~/Temp] cat f1
AAAAAAAAAAAA  1
BBBBBBBBBBBB  2
CCCCCCCCCCCC  3
DDDDDDDDDDDD  4

[jaypal:~/Temp] cat f2
AAAAAAAAAAA  5
XXXXXXXXXXX  3
YYYYYYYYYYY  2
ZZZZZZZZZZZ  1

解決:

awk '
NR==FNR {a[i++]=$2; next}
{print (a[--i] == $2 ? "Match " $2 FS a[i] : "Do not match " $2 FS a[i])}' FileB FileA
Match 1 1
Match 2 2
Match 3 3
Do not match 4 5
于 2011-12-15T02:08:51.270 に答える
0

次のようなことを考えたことはありますか?

diff --brief <(awk '{print $2}' A) <(tac B | awk '{print $2}')

tac reverses the lines of file B and then you can compare the two columns.

于 2011-12-15T02:10:52.983 に答える