使用awk从文本文件中提取最后三列

时间:2017-12-25 14:54:47

标签: awk

我有一个像这样的.txt文件:

ENST00000000442 64073050    64074640    64073208    64074651    ESRRA


ENST00000000233 127228399   127228552   ARF5
ENST00000003100 91763679    91763844    CYP51A1

我想只得到每行的最后3列。 正如你所看到的那样,在2行之间有一些空行必须被忽略。这是我想要的输出:

64073208    64074651    ESRRA
127228399   127228552   ARF5
91763679    91763844    CYP51A1

awk  '/a/ {print $1- "\t" $-2 "\t" $-3}'  file.txt.

它不会返回我想要的东西。你知道怎么纠正命令吗?

3 个答案:

答案 0 :(得分:4)

关注awk可能对您有帮助。

awk 'NF{print $(NF-2),$(NF-1),$NF}'  OFS="\t"  Input_file

输出如下。

64073208        64074651        ESRRA
127228399       127228552       ARF5
91763679        91763844        CYP51A1

编辑: 现在添加命令说明。(注意以下命令仅用于解释目的,只应在命令上方运行才能获得结果)

awk 'NF                  ###Checking here condition NF(where NF is a out of the box variable for awk which tells number of fields in a line of a Input_file which is being read).
                         ###So checking here if a line is NOT NULL or having number of fields value, if yes then do following.
{
print $(NF-2),$(NF-1),$NF###Printing values of $(NF-2) which means 3rd last field from current line then $(NF-1) 2nd last field from line and $NF means last field of current line.
}
'  OFS="\t"  Input_file  ###Setting OFS(output field separator) as TAB here and mentioning the Input_file here.

答案 1 :(得分:0)

您也可以使用sed

sed -E '/^$/d;s/.*\t(([^\t]*[\t|$]){2})/\1/' infile

答案 2 :(得分:0)

有一些管道:

$ cat file | tr -s '\n' | rev | cut -f 1-3 | rev
64073208        64074651        ESRRA
127228399       127228552       ARF5
91763679        91763844        CYP51A1

首先,cat文件tr挤出已重复的\n以消除空行。然后rev删除行cut前三个字段并再次反转。您可以使用第一个cat替换无用的rev