[英]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.