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

If column 1 is a match, change value of column 3 using Awk

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

我不能把文件从原来的地方取出来,所以我只能使用 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

我不是要为我做我的工作我只是不知道我是在浪费时间使用我拥有的工具或者我只是缺乏知识。

谢谢。

使用 GNU sed:

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

或更短:

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

并带有变量:

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

输出:

id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE04SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT

如果您想编辑文件 "in place" 使用 sed 的选项 -i

使用 GNU awk 的 FIELDWIDTHS 固定宽度字段:

$ awk '
BEGIN {
    FIELDWIDTHS="7 4 7 7 4"  3  # set the field widths
    OFS=""                      
}
=="id45678" {                 # when the first field has the given value
    ="VALUE04"                # replace the third field
}1' file                        # output
Column1Col2Column3Column4Col5
id12345TEXTVALUE01SOMCODETEXT
id23456TEXTVALUE02SOMCODETEXT
id34567TEXTVALUE02SOMCODETEXT
id45678TEXTVALUE04SOMCODETEXT
id56789TEXTVALUE03SOMCODETEXT

这其实很容易做到 awk:

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

它只查找以 id45678 开头的行并修改您想要更改的那部分行。

末尾的 1 只是一个打印行是否更改的命令(它是一个 "trick" 使用真值 1 到 select (默认)打印行的操作)。