如果列1匹配,则使用Awk更改列3的值
我必须编辑一个大文件,其中每个记录的列不由字符分隔,而是有一个固定的长度。我想在第一列中搜索一个值,如果找到,请更改第三列的值 我无法将文件从它所在的位置取出,因此我只能将命令行与awk、sed以及java5一起使用。否则我会尝试其他解决方案 bigfile.dat结构:如果列1匹配,则使用Awk更改列3的值,awk,sed,ksh,Awk,Sed,Ksh,我必须编辑一个大文件,其中每个记录的列不由字符分隔,而是有一个固定的长度。我想在第一列中搜索一个值,如果找到,请更改第三列的值 我无法将文件从它所在的位置取出,因此我只能将命令行与awk、sed以及java5一起使用。否则我会尝试其他解决方案 bigfile.dat结构: Column1Col2Column3Column4Col5 例如: id12345TEXTVALUE01SOMCODETEXT id23456TEXTVALUE02SOMCODETEXT id34567TEXTVALUE02
Column1Col2Column3Column4Col5
例如:
id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE01SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT
我需要的:设置id45678的值04
id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE04SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT
我不知道这是否可能。下面是一些我认为可以与awk一起使用的伪代码:
if (match id = subtr(Column1))
print subtr(Column1+Col2) + "mychange" +substr(Column4+Col5)
else
print unchanged line
我不是要求为我做我的工作,我只是不知道我是在浪费我的时间和我的工具,或者我只是缺乏知识
谢谢。使用GNU时:
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
id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
ID45678文本值04SOMCodeText
id56789TEXTVALUE03SOMCODETEXT
如果要“就地”编辑文件,请使用GNU sed的sed选项-i
:
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
id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
ID45678文本值04SOMCodeText
id56789TEXTVALUE03SOMCODETEXT
如果要“就地”编辑文件,请使用sed选项
-i
使用GNU awk的字段宽度
对固定宽度字段进行编辑:
$ 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 awk的
字段宽度
:
$ 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
使用
awk
,这实际上很容易做到:
pax: awk <input.txt '/^id45678/{$0=substr($0,1,11)"VALUE04"substr($0,19)}1'
id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE04SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT
pax:awk这实际上很容易使用awk
:
pax: awk <input.txt '/^id45678/{$0=substr($0,1,11)"VALUE04"substr($0,19)}1'
id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE04SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT
pax:awk这是一个相当不错的功能,我不知道,当然值得一试。这更干净,不幸的是我们有一个更老的awk版本。谢谢。这是一个相当漂亮的功能,我不知道,当然值得一试。这更干净,不幸的是我们有一个旧的awk版本。谢谢。这个很好用。这看起来很简单,但事实是我要花很长时间才能到达那里。非常感谢。这非常有效。这看起来很简单,但事实是我要花很长时间才能到达那里。非常感谢。我不知道对于旧的sed是否有任何等效的解决方案,因为这一个不支持-E或-I。幸运的是,awk解决方案成功了。谢谢。如果没有-E
的话,其中一个可以工作:sed's/^\(id45678…)…../\1VALUE04/'
sed-r's/^(id45678.{4})。{7}/\1VALUE04/'文件
我不知道对于旧的sed是否有任何等效的解决方案,因为这个方案不支持-E或-I。幸运的是,awk解决方案成功了。谢谢。如果没有-E
,其中一个可以工作:sed的/^\(id45678…)…../\1VALUE04/'
sed-r的/^(id45678.{4})。{7}/\1VALUE04/'文件