我有一个包含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
我正在努力了解代码究竟是做什么的。
那么我的代码怎么能正常工作呢?我只是不明白如何说$ 0(整行)等于NF并说FS $ 0(不确定这意味着什么)最终结果是最后一个字段现在是第一个。我确实意识到$ 14 =“”没有写入,你最终得到2个rsid列,一个在开头,一个在结尾。
我很擅长使用awk,所以如果有更简单的方法可以实现这一目标,我很乐意为之奋斗。
由于
答案 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.