我有一个恼人的问题。我有一些旧的文本文件,曾经从一个早已关闭的退休金融系统中导出。某些数据行已损坏,因此值出现在错误的列中。
例子:
123 99999
123 87675
65453 62
123 64534
第一列中的值不应包含 5 个数字,第二列应始终包含 5 个数字。
到目前为止,我想出了一种找到有问题的线路的方法:
cat tempfile | grep -n '^[0-9][0-9][0-9][0-9][0-9]'
我想找到一种方法来找到有问题的行的行号,如上所述:
65463 62
....然后插入“123”和一个空格或制表符,使其看起来像,
123 65463 62
如何以最简单的方式完成此操作,最好是在 Bash 中。
问候保罗
答案1
awk
很适合这里
$ awk 'length($1)>3{$0 = "123\t" $0} 1' ip.txt
123 99999
123 87675
123 65453 62
123 64534
length($1)
给出第一个字段的长度$0 = "123\t" $0
将根据需要更改该行的内容1
打印内容的惯用方式$0
答案2
sed -r 's/^[0-9]{5}/123\t&/' yourfile
使用 的&
特殊字符 to 来sed
表示整个匹配的字符串。
使用sed -r
可启用扩展正则表达式,特别是{ }
本示例中的 。