열이 부동인지 확인하고 싶은 요구 사항이 있습니다. 부동 소수점인 경우 다른 연결은 수행되지 않습니다 .00
.
문서:
2017 47.0000 0.783333 0.2500
1663 1920.0000 32 8.0000
예상 출력:
2017 47.0000 0.783333 0.2500
1663 1920.0000 32.00 8.0000
주문하다:
awk -F" " '{if ($9=="^[0-9]") {print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$7$8} else {print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$7}}' | head -1
답변1
awk '$3 !~ /\./ { sub($3, $3 ".00") } { print }' columns
분명히 이 권장 사항은 샘플 입력을 기반으로 합니다. 이는 다음과 같이 작동합니다. 세 번째 열(OP의 코드는 9번째 열을 사용하지만 예제 입력은 그다지 길지 않음)에 리터럴 포인트가 포함되어 있지 않으면 세 번째 열을 세 번째 열과 리터럴 문자열 .00
( 즉, 열에 문자열을 추가합니다. 그런 다음 일치 여부에 관계없이 줄을 인쇄하십시오. 이 명령은 1
일부 사용자에 의해 축약되어 사용되지만 저는 이 명령이 너무 비밀스럽다고 생각합니다.
이 솔루션은 열 자체를 교체하는 대신 문자열 교체를 사용하므로 안전하지 않습니다.
답변2
첫 번째 열 이후의 모든 열에서 정수를 찾아 다음을 추가합니다 .00
.
$ awk '{for (i=2;i<=NF;i++) if (!($i ~ /[.]/))$i=$i ".00"} 1' input
2017 47.0000 0.783333 0.2500
1663 1920.0000 32.00 8.0000
어떻게 작동하나요?
for (i=2;i<=NF;i++)
i=2
그러면 두 번째 필드에서 시작하여 마지막 필드로 이동하는 필드 루프가 시작됩니다i=NF
.if ( !($i ~ /[.]/))$i=$i ".00"
각 루프에 대해 i번째 필드 에 마침표가 포함되어
i
있는지 확인합니다 .$i
그렇다면($i ~ /[.]/)
true로 평가됩니다. 그러나 우리는 이 결과를 부정합니다. 필드가 다음인 경우에만!($i ~ /[.]/)
true입니다.i
아니요마침표가 포함되어 있습니다. 그렇다면.00
필드 끝에 추가합니다i
.이
if
문은 루프의 유일한 문입니다for
.1
이것은 awk의 전체 줄 인쇄에 대한 비밀스러운 약어입니다.