특정 열의 빈 행을 값으로 채웁니다.

특정 열의 빈 행을 값으로 채웁니다.

다음 형식의 데이터가 있습니다.

2342 1
6473 2
7463 2
3647
2734 1
9343

두 번째 열에 값이 없는 행은 해당 위치가 비어 있습니다(즉, 공백, 탭 등이 없음). 2열의 빈 슬롯에 "-9"를 넣는 간단한 명령을 찾고 있습니다.

(기본적으로 awk열 2의 행이 0이 아닌지 확인하고, 그럴 경우 "-9"를 추가하는 명령입니다.)

확장된 예(더 많은 열이 있는 데이터, 일부에는 누락된 값이 포함됨) 마지막 열에만 "-9"를 추가하고 싶습니다(즉, 다른 열은 누락될 수 있음).

2342 0 12 1
6473   13 2
7463 0 14 2
3647 0  
2734 0    1
9343 0 16 

답변1

데이터가 고정 너비 열에 표시되는 경우 다음을 수행할 수 있습니다.

첫 번째 경우:

sed 's/^.\{4\}$/& -9/'

( " -9"4자 라인에 추가).

두 번째 경우:

sed -e '/.\{11\}/b' -e 's/$/          /;s/\(.\{10\}\).*/\1-9/'

(최대 10개의 공백을 추가하고 11자 미만 줄의 경우 -9를 추가하세요).

일반적으로 고정 너비 필드가 있는 행을 구문 분석하려면 FIELDWIDTHSGNU의 특수 변수를 참조하세요 awk.

답변2

GNU sed 사용

sed ':;s/^.\{0,9\}$/& /;t;s/^.\{10\}$/&-9/' file

문자 수가 10개 미만인 경우 테스트를 사용하여 공백을 추가하세요 t.
그런 다음 줄을 10자로 바꾸고-9.

답변3

awk첫 번째 예를 시도해 볼 수 있습니다 .

awk 'NF == 1 { $2 = -9; } 1' file

다른 게시물에서 언급했듯이 gawk를 사용할 수 있으므로 FIELDWIDTHS두 번째 게시물에서 이를 시도해 볼 수 있습니다.

gawk 'BEGIN { FIELDWIDTHS = "4 1 1 1 2 1 1"} { for (i = 1; i <= NF; i++) { if ($i == "") { if (i == 7) $i = "-9"; else $i = " "; } } printf("%s %s %s %s\n", $1, $3, $5, $7); }' file

답변4

다음을 사용할 수 있습니다.

perl -ane 'if(!$F[1]){print $F[0]," -9\n"}else{print $_;}'

이 명령은 입력 내용을 한 줄씩 읽고 두 번째 열(비어 있는 경우)에 "-9"를 인쇄합니다.

echo "2342 1
6473 2
7463 2
3647
2734 1
9343" | perl -ane 'if(!$F[1]){print $F[0]," -9\n"}else{print $_;}'

2342 1
6473 2
7463 2
3647 -9
2734 1
9343 -9

관련 정보