여러 열의 값을 기준으로 별도의 열에 반복 추가

여러 열의 값을 기준으로 별도의 열에 반복 추가

열 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="|" }예를 들어 두 가지를 동시에 사용할 수 있습니다.

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로 시작하는 한 줄 %seen입니다 . state이렇게 하면 %seen초기화가 한 번만 허용됩니다. 두 번째 명령문에서 a가 뒤따르는 원래 줄 |print-ed입니다(개행 문자 없음). 그런 다음 세 번째 문에서는 처음 세 개의 열을 split열고 |다시 편집하며, 얻은 각 값은 join고유한 문자열 값을 기준으로 ++%seen{$_}해시 값을 증가시키는 데 사용됩니다. %seen추가된 가치는 put솔루션을 완성하는 것입니다.

https://raku.org

관련 정보