awk代码说明:改变字段的顺序

时间:2017-12-06 15:50:02

标签: bash awk field

我有一个包含14列的文件.txt文件。它的头部看起来像这样:

name A1 A2 Freq MAF Quality Rsq n Mean Beta sBeta CHi rsid
SNP1  A  T 0.05   1       5  56 7    8    9    11  12  rs1
SNP2  T  A 0.05   1       6  55 7    8    9    11  12  rs2

我想把最后一栏放在第一位。我不确定这样做的最有效方法是什么,但我遇到了这个,从其他帖子中激励自己:

awk '{$0=$NF FS$0; $14=""}1' file.txt | head

我获得了这个,我认为有效:

rsid    name A1 A2 Freq MAF Quality Rsq n Mean Beta sBeta CHi 
rs1     SNP1  A  T 0.05   1       5  56 7    8    9    11  12
rs2     SNP2  T  A 0.05   1       6  55 7    8    9    11  12

我正在努力了解代码究竟是做什么的。

  • 我知道NF是正在处理的行的字段数
  • 我知道FS是字段分隔符

那么我的代码怎么能正常工作呢?我只是不明白如何说$ 0(整行)等​​于NF并说FS $ 0(不确定这意味着什么)最终结果是最后一个字段现在是第一个。我确实意识到$ 14 =“”没有写入,你最终得到2个rsid列,一个在开头,一个在结尾。

我很擅长使用awk,所以如果有更简单的方法可以实现这一目标,我很乐意为之奋斗。

由于

2 个答案:

答案 0 :(得分:2)

使用sed

可能会更容易

sed -E 's/(.*)\s(\S+)$/\2 \1/' file

匹配最后一个字段和该行的其余部分,以相反顺序打印。

\s是空白字符的简写,相当于[ \t\r\n\f]。 对于非空白,\S\s的否定。相当于\s的POSIX为[:space:]。如果您的sed不支持简写表示法,或者您希望完全可移植性,则可能需要使用其中一种等效表单。

答案 1 :(得分:0)

请仔细阅读以下内容并告诉我这是否对您有帮助。

awk '{
$0=$NF FS$0;   ##Re-creating current line by mentioning $NF(last field value), FS(field separator, whose default value is space) then current line value.
$14=""         ##Now in current line(which is edited above by having last field value to very first) nullifying the last(14th field) here, you could use $NF here too(in case your Input_file have only 14 fields.
}
1              ##1 means we are making condition TRUE here and not mentioning any action so by default print action will happen.
' file.txt     ##Mentioning Input_file name here.