簡體   English   中英

在awk中將列移到最后

[英]Move column to last in awk

我想將指定的列(第2列)移動到最后一列的位置。 我有多個大的制表符分隔文件,包含可變數量的列和行。 但是,第2列都需要最后。 另一種說法是我希望訂單為1,3-last,2。

由此:

Column1 Column2 Column3 ... Column W ColumnX
1 2 3 ... W X
a b c ... apples oranges

對此:

1 3 ... W X 2
a c ... apples oranges b

我很想要awk。 從閱讀其他主題,我復制並嘗試了各種各樣的事情,但沒有成功。

#doesn't reorder columns

cut -d $'\t' -f1,3-,2 file.in > file.out


#doesn't work and I don't really understand the for(i...) stuff copied from elsewhere:
cat file.in | awk -F'\t' '{print $1,for(i=3;i<=NF;++i) $i,$2}' > file.out

救命?

任何指向線程/鏈接的指針都可以用簡單的教育術語解釋for(i ...)部分的內容。 我得到了要點,而不是語法。

awk

$ awk 'BEGIN{FS=OFS="\t"} {a=$2; for (i=2;i<NF; i++) $i=$(i+1); $NF=a}1' file
1       3       W       X       2
a       c       apples  oranges b

哪個是一樣的

awk 'BEGIN{FS=OFS="\t"} {a=$2; for (i=2;i<NF; i++) $i=$(i+1); $NF=a; print}' file

說明

  • BEGIN{FS=OFS="\\t"}將輸入和輸出字段分隔符設置為選項卡。
  • a=$2存儲第二個值。
  • for (i=2;i<NF; i++) $i=$(i+1)將每個值移動到下一個值。
  • $NF=a設置的最后一個值為2,我們存儲了。
  • 1是表示默認awk行為的真實條件: {print $0}

使用GNU awk for gensub():

$ cat file
Column1 Column2 Column3 ...     ColumnW ColumnX
1       2       3       ...     W       X
a       b       c       ...     apples  oranges

$ awk '{print gensub(/([\t][^\t]+)(.*)/,"\\2\\1","")}' file
Column1 Column3 ...     ColumnW ColumnX Column2
1       3       ...     W       X       2
a       c       ...     apples  oranges b

使用sed

sed -r 's/\W+(\w*)(.*)/\2\t\1/' file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM