파이프 구분 기호에 소스 파일이 있고 선행 0을 제거해야 합니다.
초기 파일:
010N00000001|20100111|20150112|PA|3|00001|41|+0000000100.00|+0000000000.00|+0000000000.00|022|R| |
010N00000001|20100115|20150115|PA|3|00001|41|-0000000050.00|+0000000000.00|+0000000000.00|022|R| |
원하는 출력:
010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R||
awk
누구든지 위의 구문을 제공 할 수 있습니까? 더 많은 속성이 있는데 6번째 및 8번째 소스 속성과 해당하는 6번째 및 8번째 출력 속성 값을 알고 싶습니다.
답변1
예를 들어 file
데이터가 포함된 경우:
awk -F\| -v OFS=\| '{ $6 = sprintf( "%.0f", $6 )
$8 = sprintf( "%.2f", $8 )
$9 = sprintf( "%.0f", $9 )
$10 = sprintf( "%.0f", $10 )
print }' file
이 -F\|
옵션은 (입력) 필드 구분 기호를 파이프 기호로 설정하며 -v OFS=\|
출력 필드 구분 기호에도 동일하게 적용됩니다. 할당이 있는 줄은 - 함수를 사용하여 해당 필드의 형식을 다시 지정하고 ( 동일한 매개변수로 인쇄된 내용을 sprintf()
반환함 ) 마지막으로 - 함수를 사용하여 형식이 완전히 변경된 레코드를 출력합니다 .printf()
print
다시 포맷하는 경우 sprintf()
여러 가지 중에서 선택할 수 있습니다.제어 문자그리고 관련수정자. 이 링크는 GNU awk 문서를 가리키지만 대부분의 문자는 매우 일반적입니다.
답변2
이 시도,
awk 'BEGIN{OFS=FS="|"}{$6=sprintf("%1.0f",$6);$8=sprintf("%3.2f",$8);$9=sprintf("%1.0f",$9);$10=sprintf("%1.0f",$10)}1;' tt.txt
010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R| |
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R| |
%X
, 여기서 X는 필수 숫자입니다..xf
, 여기서 x는 필수 소수점입니다.
답변3
numfmt
GNU의 GNU Coreutils 패키지는 이러한 작업에 유용합니다. 불행하게도 아직 multiple 사양을 허용하지 않는 것 같고 --field
단항 --format
숫자를 처리하지 않는 것 같습니다 +
. 약간의 논란이 있습니다:
$ sed 's/[+ ]//g' file |
numfmt -d'|' --field=8 --format='%.2f' | numfmt -d'|' --field=6,9,10 --format='%.0f'
010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R||
답변4
다음 명령을 사용해 보았더니 예상한 대로 제대로 작동했습니다.
k=`awk '{print NF}' example.txt | sort -nr| sed -n '1p'`
for ((j=1;j<=2;j++)); do for((i=1;i<=$k;i++)); do awk -F "| -v i="$i" -v j="$j" 'NR==j{print $i}' example.txt| sed "s/^[+-]//g"| sed "s/^0\{2,\}//g"| sed "s/^\..*/0/g"; done| tr "\n" "|"| sed 's/|$//g'| sed 's/^|//g'; done| sed -r "s/\s+/|\n/g"| sed "s/^|//g"
산출
010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|50.00|0|0|022|R||