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

  • 本文关键字:Awk 如果 awk sed ksh
  • 更新时间 :
  • 英文 :


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

我无法从文件所在的位置取出文件,因此我只能将命令行与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.