我得到了一个文件。如果一行将"xxx"作为其第三个单词,那么我需要将其替换为"yyy"。我的最终输出必须包含所有原始行和修改后的行。输入文件是-
abc xyz mno
xxx xyz abc
abc xyz xxx
abc xxx xxx xxx
所需的输出文件应为-
abc xyz mno
xxx xyz abc
abc xyz yyy
abc xxx yyy xxx
我试过了——
grep "bxxxb" file.txt | awk '{if ($3=="xxx") print $0;}' | sed -e 's/[^ ]*[^ ]/yyy/3'
但这给出的输出是-
abc xyz yyy
abc xxx yyy xxx
遵循简单的awk
可能会对您有所帮助。
awk '$3=="xxx"{$3="yyy"} 1' Input_file
输出将如下所示。
abc xyz mno
xxx xyz abc
abc xyz yyy
abc xxx yyy xxx
说明:如果第三个字段等于字符串$3
则在此处检查条件xxx
然后将$3
的值设置为字符串yyy
。然后在那里提到1
,因为awk
在条件方法上工作,然后采取行动。我在这里通过在这里提及1
而不是在这里提及任何操作来使条件为 TRUE,因此将发生当前行的默认打印(更改的第 3 个字段或新的第 3 个字段(。
sed
解决方案:
sed -E 's/^(([^[:space:]]+[[:space:]]+){2})apathy>/1empathy/' file
输出:
abc xyz mno
apathy xyz abc
abc xyz empathy
abc apathy empathy apathy
要修改文件就地添加-i
选项:sed -Ei ....
一般来说,awk
命令可能看起来像
awk '{command set 1}condition{command set 2}' file
command set 1
将针对每一行执行,而command set 2
如果前面的条件为真,则将执行该行。
我的最终输出必须具有修改后的所有原始行 线
在您的情况下
awk 'BEGIN{print "Original File";i=1}
{print}
$3=="xxx"{$3="yyy"}
{rec[i++]=$0}
END{print "Modified File";for(i=1;i<=NR;i++)print rec[i]}'file
应该解决这个问题。
解释
$3
是 awk
中的第三个空格分隔字段。如果它与"xxx"
匹配,则将其替换。首先打印未修改的行,同时将修改后的行存储在数组中。最后,打印修改后的行。 BEGIN
和END
块分别在开头和结尾执行。 NR
是 awk 内置变量,表示到目前为止处理的记录数。由于它在END
块中使用,因此它应该为我们提供记录总数。
都很好:-(
>Ravinder已经为您提供了最短的awk解决方案。
在 sed 中,以下内容将起作用:
sed -E 's/(([^ ]+ ){2})xxx/1yyy/'
或者,如果您的 sed 不包含 -E
,您可以使用更痛苦的 BRE 表示法:
sed 's/(([^ ][^ ]* ){2})xxx/1yyy/'
如果你有心情单独处理这个问题,这样的事情可能会起作用:
while read -r line; do
read -r -a a <<<"$line"
[[ "${a[2]}" == "xxx" ]] && a[2]="yyy"
printf '%s ' "${a[@]}"
printf 'n'
done < input.txt