0

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

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

我尝试了混合的 see plus awk 方法,但无法完成,在 bash 中执行此操作的任何提示?

4

2 回答 2

1
awk '$10=="DATA"&&$7=="A.1"{$7="B.1"}1'
于 2012-04-18T23:38:22.073 回答
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
于 2012-04-19T02:41:33.953 回答