비표준 데이터가 있는데 이를 정규화하고 싶습니다.
문서:
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**4
given .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