替换取决于其他列的值

时间:2012-04-18 22:51:19

标签: bash substitution

我想在几个大文本文件中执行条件替换。结构是

1 ad sd bg we we A.2 890 3434 DATA
2 gf nh ok wa we A.1 890 3434 DATA
3 gf nh ok wa we A.1 890 3434 
...
...

我想这样做,当第10列中存在值“DATA”时(并不总是发生),检查第7列的元素是否为A.1。在这种情况下,将其替换为B.2

我尝试过混合看加上awk方法,但无法完成它,在bash中执行此操作的任何提示?

2 个答案:

答案 0 :(得分:1)

awk '$10=="DATA"&&$7=="A.1"{$7="B.1"}1'

答案 1 :(得分:0)

以下将找到包含“DATA”和“A.1”的行,并将“A.1”替换为“B.2”,并为您提供新的输出。

注意:以下命令不区分特定字段。只要“DATA”和“A.1”出现在同一行中,“A.1”将变为“B.2”。

sed -e '/A\.1.*DATA/!d;s/A\.1/B\.2/' /yourfile

要编辑文件并保持其他行,您可能需要尝试以下bash脚本。以下内容包含内联编辑。在测试任何内容之前,请备份您的文件。

#!/bin/bash

ORIG=$(sed -e '/A\.1.*DATA/!d' /yourfile)
NEW=$(sed -e '/A\.1.*DATA/!d;s/A\.1/B\.2/' /yourfile)

sed -i "s/${ORIG}/${NEW}/g" /yourfile

注意:对于OS X用户,您可能需要尝试以下操作。 -i开关在OS X上略有不同。(脚本确实包含内联编辑,因此在测试之前请备份您的文件。)

#!/bin/bash

ORIG=$(sed -e '/A\.1.*DATA/!d' /yourfile)
NEW=$(sed -e '/A\.1.*DATA/!d;s/A\.1/B\.2/' /yourfile)

sed -i '' "s/${ORIG}/${NEW}/g" /yourfile
相关问题