我必须编辑一个大文件,其中每个记录的列不是由字符分隔,而是具有固定的长度。我想在第一列中搜索一个值,如果找到,则更改第三列的值。
我无法从文件中取出文件,因此我只能使用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
我没有要求为我做我的工作我只是不知道我是用自己的工具浪费时间,或者我只是缺乏知识。
感谢。
答案 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
。