如果第1列匹配,则使用Awk更改第3列的值

时间:2017-11-27 05:18:17

标签: awk sed ksh

我必须编辑一个大文件,其中每个记录的列不是由字符分隔,而是具有固定的长度。我想在第一列中搜索一个值,如果找到,则更改第三列的值。

我无法从文件中取出文件,因此我只能使用awk,sed和java 5的命令行。否则我会尝试其他解决方案。

bigfile.dat结构:

Column1Col2Column3Column4Col5

示例:

id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE01SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT

我需要:为id45678设置VALUE04

id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE04SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT

我不知道这是否可行。这里有一些我认为可能与awk一起使用的伪代码:

if (match id = subtr(Column1))
print subtr(Column1+Col2) + "mychange" +substr(Column4+Col5)
else
print unchanged line

我没有要求为我做我的工作我只是不知道我是用自己的工具浪费时间,或者我只是缺乏知识。

感谢。

2 个答案:

答案 0 :(得分:3)

这实际上很容易使用awk

pax: awk <input.txt '/^id45678/{$0=substr($0,1,11)"VALUE04"substr($0,19)}1'
id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE04SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT

它只是找到以id45678开头的行,并修改了您想要更改的那一行。

最后的1只是打印线条的命令,无论是否改变(使用真值1来选择打印线的(默认)动作是“技巧” )。

答案 1 :(得分:1)

使用GNU sed:

sed -E 's/^(id45678....)......./\1VALUE04/' file

或更短:

sed -E 's/^(id45678.{4}).{7}/\1VALUE04/' file

和变量:

s="id45678"
r="VALUE04"
sed -E 's/^('"$s"'.{4}).{7}/\1'"$r"'/' file

输出:

id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE04SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT

如果您要“就地”修改文件,请使用sed的选项-i