아래와 같은 파일이 있습니다. $number(위치 19-30) 및 (위치 59-70)을 센트 단위의 숫자로 바꾸는 방법은 무엇입니까?
업데이트: 모든 필드는 동일한 고정 위치에 있어야 합니다.
입력하다:
asfdassdfasfasfas 1,719.41 23:55:51 016250 9003286 1,719.41 24.64DR 381000
safsdfoskjshfkkdf 184.00 23:57:53 019516 9007963 184.00 2.94DR 384000
agereafdfbfbgsdgd 1,168.00 23:59:55 012229 9002950 1,168.00 3.54DR 0000
원하는 출력:
asfdassdfasfasfas 171941 23:55:51 016250 9003286 171941 24.64DR 381000
safsdfoskjshfkkdf 18400 23:57:53 019516 9007963 18400 2.94DR 384000
agereafdfbfbgsdgd 116800 23:59:55 012229 9002950 116800 3.54DR 0000
답변1
오래됐어awk
입력에 고정 필드 너비를 사용하고 필요에 따라 필드를 자른 다음 원래 너비로 다시 채웁니다 $2
.$4
awk 'BEGIN {FIELDWIDTHS = "19 11 29 11 30"} {
gsub(/\.|,/,"",$4); gsub(/\.|,/,"",$2);
printf "%s%11s%s%11s%s\n", $1, $2, $3, $4, $5
}' file1
문자 제거는 상황에 따라 달라지지 않고 제거되는 문자 수에 관계없이 필드가 항상 올바른 너비로 채워지므로 이는 일반적인 솔루션이어야 합니다(11).
게진
cat file1
asfdassdfasfasfas 1,719.41 23:55:51 016250 9003286 1,719.41 24.64DR 381000
safsdfoskjshfkkdf 184.00 23:57:53 019516 9007963 184.00 2.94DR 384000
agereafdfbfbgsdgd 1,168.00 23:59:55 012229 9002950 1,168.00 3.54DR 0000
가주트
asfdassdfasfasfas 171941 23:55:51 016250 9003286 171941 24.64DR 381000
safsdfoskjshfkkdf 18400 23:57:53 019516 9007963 18400 2.94DR 384000
agereafdfbfbgsdgd 116800 23:59:55 012229 9002950 116800 3.54DR 0000
답변2
고쳐 쓰다:새로운 질문에 대해서는 정확한 입력 시나리오에서만 작동하는 다음을 시도해 보십시오.
sed -Ee 's/([0-9]),([0-9]{3})./ \1\2/g;s/ ([0-9]{3})\./ \1/g' <<inputFile>>
출력: .
$ sed -Ee 's/([0-9]),([0-9]{3})./ \1\2/g;s/ ([0-9]{3})\./ \1/g' temp.txt
asfdassdfasfasfas 171941 23:55:51 016250 9003286 171941 24.64DR 381000
safsdfoskjshfkkdf 18400 23:57:53 019516 9007963 18400 2.94DR 384000
agereafdfbfbgsdgd 116800 23:59:55 012229 9002950 116800 3.54DR 0000
$ head -1 temp.txt
asfdassdfasfasfas 1,719.41 23:55:51 016250 9003286 1,719.41 24.64DR 381000
$ head -1 temp.txt | wc -c
88
$ sed -Ee 's/([0-9]),([0-9]{3})./ \1\2/g;s/ ([0-9]{3})\./ \1/g' | head -1
asfdassdfasfasfas 171941 23:55:51 016250 9003286 171941 24.64DR 381000
$ sed -Ee 's/([0-9]),([0-9]{3})./ \1\2/g;s/ ([0-9]{3})\./ \1/g' temp.txt | head -1 | wc -c
88
(일반적인)각 열 값을 전체 문자열 대신 필드로 처리하여 awk를 사용할 수 있습니다.
awk '{gsub(",",""); $2=$2*100;$6=$6*100; }1' <<inputFile>> | rev | column -t | rev
산출:
asfdassdfasfasfas 171941 23:55:51 016250 9003286 171941 24.64DR 381000
safsdfoskjshfkkdf 18400 23:57:53 019516 9007963 18400 2.94DR 384000
agereafdfbfbgsdgd 116800 23:59:55 012229 9002950 116800 3.54DR 0000