我有一个包含以下记录的文件 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"}'