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

如果列1匹配,则使用Awk更改列3的值,awk,sed,ksh,Awk,Sed,Ksh,我必须编辑一个大文件,其中每个记录的列不由字符分隔,而是有一个固定的长度。我想在第一列中搜索一个值,如果找到,请更改第三列的值 我无法将文件从它所在的位置取出,因此我只能将命令行与awk、sed以及java5一起使用。否则我会尝试其他解决方案 bigfile.dat结构: Column1Col2Column3Column4Col5 例如: id12345TEXTVALUE01SOMCODETEXT id23456TEXTVALUE02SOMCODETEXT id34567TEXTVALUE02

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

我无法将文件从它所在的位置取出,因此我只能将命令行与awk、sed以及java5一起使用。否则我会尝试其他解决方案

bigfile.dat结构:

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/'文件