複数の列の値に基づいて別々の列に繰り返しを追加する

複数の列の値に基づいて別々の列に繰り返しを追加する

列1、2、3の最後の列の項目数に基づいてパイプで区切られたファイルを追加しようとしています。

頑張りましたawk '{ print $0 "|" ++count[$1,$2,$3] }'

ただし、すべての行の最後の列にのみ数値1を生成し、次のように追加のパイプを追加します。

123|456365|PASS|566563|Apple||1
123|456365|PASS|566563|Apple||1
123|456365|FAIL|34322|Apple1||1
123|456365|FAIL|35322|Apple2||1

誰かが私が以下で予想される結果を得るのを助けることができれば非常に役立ちます。

入力ファイル

123|456365|PASS|566563|Apple
123|456365|FAIL|34322|Apple1
123|456365|FAIL|35322|Apple2
123|456335|PASS|56655|Apple34
123|456335|FAIL|34325|Apple53
123|34343|PASS|35323|Apple1
123|34343|PASS|34342|Apple13
123|34343|PASS|343442|Apple13

期待される出力

123|456365|PASS|566563|Apple|1
123|456365|FAIL|34322|Apple1|1
123|456365|FAIL|35322|Apple2|2
123|456335|PASS|56655|Apple34|1
123|456335|FAIL|34325|Apple53|1
123|34343|PASS|35323|Apple1|1
123|34343|PASS|34342|Apple13|2
123|34343|PASS|343442|Apple13|3

答え1

フィールドセパレータが何であるかをawkに教えてください。

awk -F'|' -v OFS='|' '{ print $0, ++count[$1,$2,$3] }' infile

-F入力フィールド区切り文字を定義し、代わりに出力フィールド区切り-v OFS文字を定義します。BEGIN{ FS=OFS="|" }たとえば、2 つを同時に使用できます。

awk 'BEGIN{ FS=OFS="|" } { print $0, ++count[$1,$2,$3] }' infile

答え2

Raku(以前のPerl_6)の使用

raku -ne ' state %seen; print($_, "|"); for $_.split("|").[0..2].join() { (++%seen{$_}).put };'

または

raku -ne ' state %seen; print($_, "|"); ( ++%seen{$_} ).put for .split("|").[0..2].join;' 

入力例:

123|456365|PASS|566563|Apple
123|456365|FAIL|34322|Apple1
123|456365|FAIL|35322|Apple2
123|456335|PASS|56655|Apple34
123|456335|FAIL|34325|Apple53
123|34343|PASS|35323|Apple1
123|34343|PASS|34342|Apple13
123|34343|PASS|343442|Apple13

出力例:

123|456365|PASS|566563|Apple|1
123|456365|FAIL|34322|Apple1|1
123|456365|FAIL|35322|Apple2|2
123|456335|PASS|56655|Apple34|1
123|456335|FAIL|34325|Apple53|1
123|34343|PASS|35323|Apple1|1
123|34343|PASS|34342|Apple13|2
123|34343|PASS|343442|Apple13|3

上記は、Perlプログラミング言語ファミリーであるRakuで書かれたソリューションです。つまり、(行別、非自動印刷)フラグをraku使用してコマンドラインから実行します。-neハッシュ値は-dで始まる1行%seenです。stateこれにより、%seen初期化が一度だけ許可されます。 2番目のステートメントでは、aが続く元の行|print-edです(改行文字なし)。 3番目のステートメントでは、最初の3つの列を開いてsplit|編集し、得られた各値を使用して、一意joinの文字列値に基づいて++%seen{$_}ハッシュ値を増やします。%seen追加された価値はputソリューションを完成させることです。

https://raku.org

関連情報