![如何替换文件特定列中给定条件的值](https://linux22.com/image/69952/%E5%A6%82%E4%BD%95%E6%9B%BF%E6%8D%A2%E6%96%87%E4%BB%B6%E7%89%B9%E5%AE%9A%E5%88%97%E4%B8%AD%E7%BB%99%E5%AE%9A%E6%9D%A1%E4%BB%B6%E7%9A%84%E5%80%BC.png)
我有由管道分隔的文件|
,我希望当第 6 列包含第 7 列中的字母I
打印时0758000
,以及当第 6 列包含第 7 列中的字母A
打印时0800000
,我找不到该怎么做!
例子:
原始文件
cat file1.txt
Z89|EEE333333|100001|JANMC84|19990101|I|1800040
Z89|EEE444444|200001|JANMC84|19990101|I|1800040
Z89|EEE222222|300001|JANMC84|19990101|A|1800040
Z89|EEE555555|700001|JANMC84|19990101|A|1800040
结果应该是:
Z89|EEE333333|100001|JANMC84|19990101|I|0758000
Z89|EEE444444|200001|JANMC84|19990101|I|0758000
Z89|EEE222222|300001|JANMC84|19990101|A|0800000
Z89|EEE555555|700001|JANMC84|19990101|A|0800000
答案1
你可以用 awk 来做到这一点
awk -F\| 'BEGIN {OFS=FS} $6 == "A" {$7 = "0800000"} $6 == "I" {$7 = "0758000"}; 1' file1.txt
这将awk
基于 分割字段,然后在我们写回行时|
将输出字段分隔符设置为。|
然后,如果第六个字段$6
, 将A
第七个字段替换为特定值,如果是 I,则替换为不同的值。然后在末尾打印该行,并包含我们的更改(如果我们做了任何更改)。
答案2
和sed
:
sed -e 's/\(I|\)[^|]*$/\10758000/;s/\(A|\)[^|]*$/\10800000/' file1.txt
要点是将or (即最后一列)s
之后的所有内容替换为所需的数字。I|
A|
结果:
Z89|EEE333333|100001|JANMC84|19990101|I|0758000
Z89|EEE444444|200001|JANMC84|19990101|I|0758000
Z89|EEE222222|300001|JANMC84|19990101|A|0800000
Z89|EEE555555|700001|JANMC84|19990101|A|0800000
答案3
SLPJP_Box 11/03/2017 22:00:07 ----- RU 13232789/1
SLPJP_PRD_SOB_MAIN 09/07/2017 22:00:30 09/07/2017 22:00:57 OI 11769239/1 0
SLPJP_PRD_SOD_BOX 11/03/2017 22:00:18 ----- RU 13232789/1
SLPJP_PRD_SOD_001 11/03/2017 22:00:34 11/03/2017 23:10:25 SU 13232789/1 0
SLPJP_PRD_SOD_002 11/03/2017 23:10:26 ----- RU 13232789/1
SLPJP_PRD_SOD_003 ----- 11/02/2017 22:18:34 AC 13232789/0
SLPJP_PRD_SOD_004 ----- 11/02/2017 22:19:55 AC 13232789/0
我想打印所有列,但删除所有列 SU、OI、AC 列,并删除任何分隔符的所有空白空间