열 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
솔루션을 완성하는 것입니다.