AWK:以相反的顺序打印随机文件的内容

时间:2016-12-26 13:11:32

标签: awk

假设我们有一个文件,其中每一行都有不同的字数。 像这样:

Ref

我想以相反的顺序打印它。喜欢这个

Douglas Texn 98 64 44
54 88 27 37
Violet Denesik Texn 40 89 70
Blanche Hoeger
Johnathon Schultz Texn 51 41 24 96

我的想法是首先颠倒行的顺序,然后是列,但我不能实现第二部分。

实施第一部分的代码

96 24 41 51 Texn Schultz Johnathon
...
44 64 98 Texn Douglas

有什么想法?

5 个答案:

答案 0 :(得分:1)

一种扭转单词序列的方法:

awk '{x=split($0,a); for(i=x;i!=0;i--){y=y?y OFS a[i]:a[i];}print y;y=""}' file

答案 1 :(得分:1)

您可以tac

之前使用awk man tac,“反向连接和写入文件”
tac file | awk '{for(i=1; i<=NF/2; ++i){ temp=$i; $i=$(NF-i+1); $(NF-i+1)=temp }}1'

你明白了,

96 24 41 51 Texn Schultz Johnathon
Hoeger Blanche
70 89 40 Texn Denesik Violet
37 27 88 54
44 64 98 Texn Douglas

<强>解释

temp=$i; $i=$(NF-i+1); $(NF-i+1)=temp是交换算法,

temp := x
x := y
y := temp

编辑:仅awk解决方案

awk '{
    for(i=1; i<=NF/2; ++i){ temp=$i; $i=$(NF-i+1); $(NF-i+1)=temp }
    a[c++]=$0
}END{--c; for(;c>=0;c--){print a[c]}}' file

你明白了,

96 24 41 51 Texn Schultz Johnathon
Hoeger Blanche
70 89 40 Texn Denesik Violet
37 27 88 54
44 64 98 Texn Douglas

答案 2 :(得分:1)

Dinos_123455,请你试试看,如果有帮助请告诉我。如果您的o.s支持tac命令,那么以下内容可以帮助您。

tac file1 | awk '{for(i=NF;i>0;i--){printf("%s ",$i)};print X}'

我希望这会有所帮助。

编辑:根据您的要求,只有awk解决方案也可以帮助您。

awk 'FNR==NR{A[++i]=$0;next} {for(k=i;k>0;k--){num=split(A[k], array," ");for(q=num;q>0;q--){printf("%s ",array[q])};if(A[k]){print X};delete A[k]}}' file1 file1

答案 3 :(得分:1)

使用GNU awk实现真正的多维数组:

$ awk '{a[NR][1]; split($0,a[NR])} END{PROCINFO["sorted_in"]="@ind_num_desc"; for (r in a) for (c in a[r]) printf "%s%s", a[r][c], (c>1?OFS:ORS)}' file
96 24 41 51 Texn Schultz Johnathon
Hoeger Blanche
70 89 40 Texn Denesik Violet
37 27 88 54
44 64 98 Texn Douglas

其他问题:

awk '{a[NR]=$0} END{for (r=NR;r>0;r--) { nc=split(a[r],b); for (c=nc;c>0;c--) printf "%s%s", b[c], (c>1?OFS:ORS) } }' file
96 24 41 51 Texn Schultz Johnathon
Hoeger Blanche
70 89 40 Texn Denesik Violet
37 27 88 54
44 64 98 Texn Douglas

答案 4 :(得分:0)

所有awk版本:

$ awk '{ for(i=NF;i>=1;i--)                  # iterate fields backwards
             a[NR]=a[NR] sprintf ($i OFS) }  # append to array indexed on NR
   END { for(i=NR;i>=1;i--)                  # reverse NR order
             print a[i] }' file              # output
96 24 41 51 Texn Schultz Johnathon 
Hoeger Blanche 
70 89 40 Texn Denesik Violet 
37 27 88 54 
44 64 98 Texn Douglas