![文件进程打印第一列的最后 2 个字符以及其余字符](https://linux22.com/image/1548086/%E6%96%87%E4%BB%B6%E8%BF%9B%E7%A8%8B%E6%89%93%E5%8D%B0%E7%AC%AC%E4%B8%80%E5%88%97%E7%9A%84%E6%9C%80%E5%90%8E%202%20%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%BB%A5%E5%8F%8A%E5%85%B6%E4%BD%99%E5%AD%97%E7%AC%A6.png)
我有 11 列的输入文件,需要处理这些文件,输出第一列的最后 2 位数字并打印其余列。字段以逗号分隔。我尝试了一些命令,但没有得到正确的结果。需要一个 shell 脚本来处理这个包含更多记录的文件
输入
9303176179,989303176179,15335,A,1,9,1,0,201712091400,0,0
9303138379,989303138379,15335,A,1,9,1,0,201712091400,0,0
9302922849,989302922849,15335,A,1,9,1,0,201712091400,0,0
9334284759,989334284759,15335,A,1,9,1,0,201712091400,0,0
9334200459,989334200459,15335,A,1,9,1,0,201712091400,0,0
9334022869,989334022869,15335,A,1,9,1,0,201712091400,0,0
9334499819,989334499819,15335,A,1,9,1,0,201712091400,0,0
9334036329,989334036329,15335,A,1,9,1,0,201712091400,0,0
9303053859,989303053859,15335,A,1,9,1,0,201712091400,0,0
9302997519,989302997519,15335,A,1,9,1,0,201712091400,0,0
预期输出
79,989303176179,15335,A,1,9,1,0,201712091400,0,0
79,989303138379,15335,A,1,9,1,0,201712091400,0,0
49,989302922849,15335,A,1,9,1,0,201712091400,0,0
59,989334284759,15335,A,1,9,1,0,201712091400,0,0
59,989334200459,15335,A,1,9,1,0,201712091400,0,0
69,989334022869,15335,A,1,9,1,0,201712091400,0,0
19,989334499819,15335,A,1,9,1,0,201712091400,0,0
29,989334036329,15335,A,1,9,1,0,201712091400,0,0
59,989303053859,15335,A,1,9,1,0,201712091400,0,0
19,989302997519,15335,A,1,9,1,0,201712091400,0,0
答案1
我不知道您尝试过什么工具,但我用它sed
来做这种事:
sed 's/^[^,]*\([^,][^,],.*$\)/\1/g'
您可以将其用作过滤器(sed ... <InFile >OutFile
)或使用-i
选项来更新要添加到运行字符串的文件名(sed -i ... InFile
)。
这将搜索每一行,查找第一个逗号前的最后两个字符,使用[^,]
匹配除逗号之外的任何字符。然后,它在这两个字符之前用 开始匹配字段,\(
并在行末用 结束匹配字段\)
。然后,此匹配字段将替换从行首开始的整个匹配表达式。
我习惯使用正则表达式,所以我发现写这个很简单,但我首先承认它们很难学。
答案2
使用cut
和paste
:
paste -d, <(cut -f1 -d, input.csv | rev | cut -c1,2 | rev) \
<(cut -f2- -d, input.csv)
由于cut
无法从右边数出字符,我rev
过去常常还原第一列中的每个数字,然后用提取前两个字符cut
并还原回来。