2017-02-02 3 views
0

こんにちは、この質問を読んでいただきありがとうございます。最終日には私は問題を解決しようとしており、解決策に近づいていません。AWK:連続する行の一致する列を確認する

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

目標はもっとして1機の戦闘機を持っている持っている「トレーナー」を識別することです:私は、次が含まれているデータのサンプルファイルを持っています。私の直感は「getline」であり、AWKの変数宣言ディレクティブが必要になるでしょう。私はさまざまな組み合わせを試しました

awk [email protected] 'NR>1{a=$2; getline; if($2 = a) {print $0,"Yes"} else {print $0,"NO"}}' sample.txt 

しかし、出力は希望の結果に近くありません。実際には、サンプルファイルのすべての行を出力しません。

私の望ましい結果は以下のとおりです。私は完全にここからどこへ行くにとして失われています

[email protected] 
[email protected]@NO 
[email protected]@NO 
[email protected]@YES 
[email protected]@YES 
[email protected]@NO 
[email protected]@NO 
[email protected]@NO 
[email protected]@NO 
[email protected]@YES 
[email protected]@YES 
[email protected]@NO 
[email protected]@NO 

。私は検索して、役に立たない解決策を見つけようとしており、私はいくつかの情報を探しています。ありがとうございました!

答えて

4

getlineは必要ありません。あなたは、通常、 はトレーナー当たりのカウントを構築する入力を処理 とENDブロックで結果を印刷することができ :

awk [email protected] '{ 
    lines[NR] = $0; 
    trainers[NR] = $2; 
    counts[$2]++; 
} 
END { 
    print lines[1]; 
    for (i = 2; i <= length(lines); i++) { 
    print lines[i] "@" (counts[trainers[i]] > 1 ? "YES" : "NO"); 
    } 
}' sample.txt 
1

別のオプションは二つのパスを作ることです。

$ cat p.awk 
BEGIN {FS=OFS="@"} 
NR==1 {print;next}; 
NR==FNR {++trainers[$2]; next} 
FNR>1 {$3=(trainers[$2]>1)?"YES":"NO"; print} 

$ awk -f p.awk p.txt p.txt 
[email protected] 
[email protected]@NO 
[email protected]@NO 
[email protected]@YES 
[email protected]@YES 
[email protected]@NO 
[email protected]@NO 
[email protected]@NO 
[email protected]@NO 
[email protected]@YES 
[email protected]@YES 
[email protected]@NO 
[email protected]@NO 

を説明しました:

入力ファイルと出力ファイルの区切り文字を設定します。

BEGIN {FS=OFS="@"} 

プリントヘッダ:

NR==1 {print;next}; 

最初のパス、各トレーナーの出現回数を数える:

NR==FNR {++trainers[$2]; next} 

第二のパスは、トレーナー数、印刷結果に応じてYESまたはNOを設定しない:

FNR>1 {$3=(trainers[$2]>1)?"YES":"NO"; print} 
関連する問題