2016-12-26 81 views
0

假設我們有一個文件,每行有不同的字數。 像這樣:AWK:按相反順序打印隨機文件的內容

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 

我的想法是顛倒行首先,然後是列的順序,但我不能實現第二部分。

代碼執行的第一部分

{a[NR]=$0} END {for(i=NR;i>0;i--)print a[i]} 

有什麼想法?扭轉的字序列

回答

1

您可以使用tacman tac, 「連擊和寫入反向文件」,先於awk

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 
+0

想使用它,但我只想使用awk進行練習。我無法理解這一點:/ –

+0

@ Dinos_12345我添加了awk解決方案 –

+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 
+0

你能解釋一下這部分呢? 'y = y?y OFS a [i]:a [i];} print y; y =「」'Thank you :) –

+0

如果y爲空,則將[i]分配給y,否則concatnate y和a [我]並將其重新分配給y。 – Guru

+0

我看到你正在檢查'y = y'是否合理,因爲它總是如此。 –

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 
+0

想使用它,但我只想使用awk進行練習。 –

+0

@ Dinos_12345,根據您的要求添加了只有awk的解決方案,請讓我知道這是否有助於您。 – RavinderSingh13

+0

給出了一個更簡單的解決方案,這太複雜了。 –

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 

與其他awks:

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 
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