awk는 수정된 줄만 인쇄합니다.

awk는 수정된 줄만 인쇄합니다.

이런 파일이 있어요

d1000 1000
d1001 100
d1002 10
d1003 1

길이가 4가 아닌 두 번째 열을 수정하고 싶습니다. 하지만 수정된 행만 인쇄하고 싶기 때문에 2열의 원본 텍스트는 2열에 남아 있고 변경 사항은 숫자가 증가하여 세 번째 열에 인쇄됩니다.

원하는 출력:

d1001 100 1101
d1002 10  1102
d1003 1  1103

다음 줄을 따르려고 하는데 구문이나 결과를 얻을 수 없습니다.

awk -v n=1100 '((length($2)!=4 && length($2)>0) {new=($2=++n)}; {print $1, $2, new}' file

답변1

print기존 행()의 매개변수와 이와 같은 $0새 필드 ,사이에 출력 구분 기호를 사용할 수 있습니다.

awk -v n=1100 'length($2)!=4 {print $0,++n}' file

산출:

d1001 100 1101
d1002 10 1102
d1003 1 1103

다른 출력 형식이 필요한 경우 사용할 수 있습니다.printf기능. 다음은 정렬의 예입니다.

$ awk -v n=1100 'length($2)!=4 {printf "%s %4s %s\n", $1, $2, ++n}' file
d1001  100 1101
d1002   10 1102
d1003    1 1103
$ awk -v n=1100 'length($2)!=4 {printf "%s %-4s %s\n", $1, $2, ++n}' file
d1001 100  1101
d1002 10   1102
d1003 1    1103

답변2

awk -v k=1100 '{if(length($2) !=4  && length($2)>0){k=k+1;print $1,$2,k }}' file.txt 

산출

d1001 100 1101
d1002 10 1102
d1003 1 1103

답변3

사용행복하다(이전 Perl_6)

raku -ne 'state $i; if .words[1].match( /^ \d**0..3 $/ ) { print .words~" "; put ++$i + 1100 };'  

이 질문은 최근 질문과 유사합니다. 해당 질문에 대한 Raku 답변을 약간 수정할 수 있습니다.

간단히 말해서(이전 질문과 비교하여) if .words[1]두 번째 열에 \d**0..30~3자리 숫자만 포함하는 문자열과 일치할 수 있는지 묻고, 그렇다면 all 을 인쇄한 다음, 증가하는 베이스에서 시작하여 .wordscounter 를 반환하는 세 번째 열이 옵니다. 값 .$i1100++

입력 예:

d1000 1000
d1001 100
d1002 10
d1003 1

예제 출력:

d1001 100 1101
d1002 10 1102
d1003 1 1103

https://unix.stackexchange.com/a/703436/227738
https://raku.org

관련 정보