我必须编辑一个大文件,其中每条记录的列不是由字符分隔,而是具有固定长度。我想在第一列中搜索一个值,如果找到,则更改第三列的值。
我无法从文件所在的位置取出文件,因此我只能将命令行与awk,sed和java 5一起使用。 否则我会尝试其他解决方案。
大文件.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
我不是要求为我做我的工作,我只是不知道我在浪费时间在我拥有的工具上,或者我只是缺乏知识。
谢谢。
这实际上很容易用awk
做到:
pax: awk <input.txt '/^id45678/{$0=substr($0,1,11)"VALUE04"substr($0,19)}1'
id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE04SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT
它只是查找以id45678
开头的行,并修改要更改的行部分。
末尾的1
只是一个命令,用于打印行,无论是否更改(这是一个使用真值1
选择打印行的(默认)操作的"技巧")。
使用 GNU awk 的固定宽度字段FIELDWIDTHS
:
$ awk '
BEGIN {
FIELDWIDTHS="7 4 7 7 4" 3 # set the field widths
OFS=""
}
$1=="id45678" { # when the first field has the given value
$3="VALUE04" # replace the third field
}1' file # output
Column1Col2Column3Column4Col5
id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE04SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT
使用 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
输出:
id12345文本值01SOMCODETEXT id23456文本值02SOMCODETEXT id34567文本值02SOMCODETEXT id45678文本值04SOMCODETEXT id56789文本值03SOMCODETEXT
如果要"就地"编辑文件,请使用 sed 的选项-i
.