如何替换文件中每一行的固定位置

如何替换文件中每一行的固定位置

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

相关内容