如何通过 awk 更改一行中的一列并添加其他列

如何通过 awk 更改一行中的一列并添加其他列

我有一个包含以下记录的文件 MDD.TXT。文件:MDD.TXT

0|ABC|055309|20120929053309|11965150   
0|ABC|061434|20120929063434|11155537  
0|ABC|070228|20120929073228|11965150  
0|ABC|082213|20120929583213|11965150  
0|ABC|083950|20120929983950|11965150  
0|ABC|084112|20120929083112|11965150

现在我想用“XYZ”替换第二列,并想在所有记录中添加两列文件名和“成功”。所需的输出应如下:

0|XYZ|055309|20120929053309|11965150|MDD.TXT|SUCCESS
0|XYZ|061434|20120929063434|11155537|MDD.TXT|SUCCESS
0|XYZ|070228|20120929073228|11965150|MDD.TXT|SUCCESS
0|XYZ|082213|20120929583213|11965150|MDD.TXT|SUCCESS
0|XYZ|083950|20120929983950|11965150|MDD.TXT|SUCCESS
0|XYZ|084112|20120929083112|11965150|MDD.TXT|SUCCESS

答案1

sed您也可以使用

$ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT

直接对文件进行修改

$ sed -i -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT

保留原始文件并将所需的输出重定向到其他文件

$ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT >> MDD_MODIFFIED.TXT

答案2

您可以尝试以下操作awk

awk 'BEGIN { FS = OFS = "|" } { $2 = "XYZ"; $6 = ARGV[1]; $7 = "SUCCESS";} 1' MDD.TXT

或者:

awk 'BEGIN { FS = OFS = "|" } { $2 = "XYZ"; print $0 OFS ARGV[1] OFS "SUCCESS"; }' MDD.TXT

答案3

awk

awk 'BEGIN{OFS=FS="|"} {$2="XYZ"; $0=$0"|"FILENAME"|SUCCESS"}1' mdd.txt

在哪里:

  • BEGIN{}仅在开头执行,而不是每行执行。
  • OFS=FS="|"将输入和输出字段分隔符设置为|
  • $2="XYZ"将第二个字段设置为XYZ
  • $0=...FILENAME将(来自awk内部变量)并SUCCESS作为字符串附加到整行。

答案4

这与现有答案相同awk,但更简洁:

awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,"MDD.TXT","SUCCESS"}' MDD.TXT

要使其自动添加文件名(对于任何文件名),请使用:

awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT

设置-F输入记录分隔符并-vOFS设置OFS变量、输出记录分隔符。然后,我们将第二个字段设置为XYZ并打印行 ( $0)、文件名 ( ARGV[1]) 和SUCCESS.

请注意,在您的示例中,每行都有尾随空格,因此运行任何建议的解决方案将导致:

$ awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT 
0|XYZ|055309|20120929053309|11965150   |MDD.TXT|SUCCESS
0|XYZ|061434|20120929063434|11155537  |MDD.TXT|SUCCESS
0|XYZ|070228|20120929073228|11965150  |MDD.TXT|SUCCESS
0|XYZ|082213|20120929583213|11965150  |MDD.TXT|SUCCESS
0|XYZ|083950|20120929983950|11965150  |MDD.TXT|SUCCESS
0|XYZ|084112|20120929083112|11965150|MDD.TXT|SUCCESS

为了避免这种情况,您可以将输入字段分隔符设置为| 或者空间:

$ awk -F' |' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT 
0|ABC|055309|20120929053309|11965150|XYZ|||MDD.TXT|SUCCESS
0|ABC|061434|20120929063434|11155537|XYZ||MDD.TXT|SUCCESS
0|ABC|070228|20120929073228|11965150|XYZ||MDD.TXT|SUCCESS
0|ABC|082213|20120929583213|11965150|XYZ||MDD.TXT|SUCCESS
0|ABC|083950|20120929983950|11965150|XYZ||MDD.TXT|SUCCESS
0|ABC|084112|20120929083112|11965150|XYZ|MDD.TXT|SUCCESS

或者,您可以在解析文件之前删除尾随空格:

sed 's/\s*$//' MDD.TXT | 
    awk -F' |' -vOFS="|" '{$2="XYZ"; print $0,"MDD.TXT|SUCCESS"}'

相关内容