我有一个如下文件,如何用其以美分为单位的数字替换 $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