길이가 같으면 awk는 열 값을 증분 값으로 바꿉니다.

길이가 같으면 awk는 열 값을 증분 값으로 바꿉니다.

비표준 데이터가 있는데 이를 정규화하고 싶습니다.

문서:

d101 11001
e101 9665
f101 9663
d102 11002
e102 11003
f102 11004
g102 11005

원하는 출력:

d101 11001
e101 12001
f101 12002
d102 11002
e102 11003
f102 11004
g102 11005

따라서 컬럼 2의 길이가 4인 경우 이를 제공된 계열의 증분 번호로 대체해야 한다는 논리가 있어야 합니다. 이 경우 1200은 계열이고 & 1, 2, 3..은 증분입니다.

답변1

$ awk -v n=12000 'length($2)==4 {$2=++n} {print}' file
d101 11001
e101 12001
f101 12002
d102 11002
e102 11003
f102 11004
g102 11005

먼저 증가한 n다음 새 값을 사용하도록 할당합니다. 처음부터 인쇄하려면 12000다음을 사용하고 $2=n++먼저 할당한 다음 증가시킵니다.

답변2

사용행복하다(이전의 Perl6)

raku -ne 'state $i; print .words[0]~" "; put S/^ \d**4 $/{++$i + 12000}/ given .words[1];' 

즉, raku는 -ne(한 줄씩, 자동 인쇄 아님) 플래그를 사용하여 명령줄에서 호출됩니다. 코드에서 증가할 변수 state(한 번만)를 선언합니다. 두 번째 명령문에서는 .words[0]공백으로 구분된 첫 번째 "단어"(즉, 열) printed뒤에 ~물결표로 연결된 " "공백(출력 열을 구분하는 데 사용됨)이 옵니다. 세 번째 명령문에서 (big-S) 대체 명령은 (두 번째 열) 내에서 정확히 4개의 숫자를 S///검색합니다 . 일치 항목은 계산된 값으로 대체되고 (중괄호는 정규 표현식의 코드 블록을 나타냄) 반환됩니다( 큰 S 대체는 수정된 문자열을 반환하기 때문입니다).\d**4given .words[1]{++$i + 12000}S///

입력 예:

d101 11001
e101 9665
f101 9663
d102 11002
e102 11003
f102 11004
g102 11005

예제 출력:

d101 11001
e101 12001
f101 12002
d102 11002
e102 11003
f102 11004
g102 11005

https://raku.org

관련 정보