我正在尝试解决以下问题,例如:
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
答案 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
答案 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