如何使用脚本在文件中找到匹配的单词并以相反的顺序打印该行的单词?

时间:2019-02-10 09:53:35

标签: linux unix awk grep

我正在尝试解决以下问题,例如:

abdkfsj | kfjlds | james
sdlfjk | sfdjsldfjk | andrew
sdjfsdl | dskljoer | james

我被要求找到包含卡纸的行并以相反的顺序打印它们,上面示例的输出将是-

james | kfjlds | abdkfsj
james | dskljoer | sdjfsdl

有人可以告诉我如何解决这个问题,以及使用Shell脚本在Unix中使用什么命令来解决这个问题?

尝试过:

awk -F"|" '{ print $3 $2 $1}' | grep --line-buffered james input.txt 

4 个答案:

答案 0 :(得分:3)

type()

如果行包含awk '/james/{for (i=NF; i>1; i--) printf "%s%s", $i, FS; print $i}' file ,则以相反的顺序输出其列。

输出:

james | kfjlds | abdkfsj
james | dskljoer | sdjfsdl

来源:https://stackoverflow.com/a/21944886/3776858

答案 1 :(得分:1)

好吧,实际上您的方法正确,只需设置OFS,并添加条件:

awk -F'|' -v OFS="|" '/james/{print $3,$2,$1}' input.txt

因此,通过此命令,您可以执行此操作,而无需通过管道传递给grep。

如果有很多要反转的列:

awk -F'|' '/james/{for(i=1;i<=NF/2;i++){j=NF-i+1;t=$i;$i=$j;$j=t}print}' OFS='|' input.txt

在这里,我使用了另一种方法,即实际上将高列与低列交换,并在输入文件之前分配OFS,以节省-v的必要性。

好吧,如果您也想保留空格,请使用以下GNU awk解决方案:

awk -F' *[|] *' -v OFS=' | ' '/james/{print $3,$2,$1}' input.txt
james | kfjlds | abdkfsj
james | dskljoer | sdjfsdl

$ awk -F' *[|] *' '/james/{for(i=1;i<=NF/2;i++){j=NF-i+1;t=$i;$i=$j;$j=t}print}' OFS=' | ' input.txt
james | kfjlds | abdkfsj
james | dskljoer | sdjfsdl

答案 2 :(得分:1)

将grep命令用作awk的输入的语法不正确。它几乎不需要调整并添加OFS =“ |”在BEGIN中开始工作。检查一下

 awk -F"|" 'BEGIN { OFS="|"} { print $3,$2,$1}' <(grep --line-buffered james divesh.txt)

带有输入。

$ cat divesh.txt
abdkfsj | kfjlds | james
sdlfjk | sfdjsldfjk | andrew
sdjfsdl | dskljoer | james

$ awk -F"|" 'BEGIN { OFS="|"} { print $3,$2,$1}' <(grep --line-buffered james divesh.txt)
 james| kfjlds |abdkfsj
 james| dskljoer |sdjfsdl

$

答案 3 :(得分:1)

您可以尝试sed:

sed '/james/s/\([^|]*\)\( *| *\)\([^|]*\)\2\([^|]*\)/\4 \2\3\2\1/' infile