修改制表符分隔的txt文件

时间:2018-03-27 17:53:04

标签: awk sed

我想使用linux命令sed / awk /或任何其他方法修改制表符分隔的txt文件

这是我要为R boxplot输入修改的制表符分隔的txt文件的示例:

----输入格式的开始---------

chr8    38277027    38277127    Ex8_inner
    25425   8   100 0.0800000
chr8    38277027    38277127    Ex8_inner
    25426   4   100 0.0400000
chr9    38277027    38277127    Ex9_inner
    25427   9   100 0.0900000
chr9    38277027    38277127    Ex9_inner
    25428   1   100 0.0100000
chr10   38277027    38277127    Ex10_inner
    30935   1   100 0.0100000
chr10   38277027    38277127    Ex10_inner
    31584   1   100 0.0100000
all 687 1   1000    0.0010000
all 694 1   1000    0.0010000
all 695 1   1000    0.0010000
all 697 1   1000    0.0010000
all 699 6   1000    0.0060000
all 700 2   1000    0.0020000
all 723 7   1000    0.0070000
all 740 8   1000    0.0080000
all 742 1   1000    0.0010000
all 761 5   1000    0.0050000
all 814 2   1000    0.0020000
all 821 48  1000    0.0480000

------输入文件格式结束------

我希望它被修改,以便第4列奇数行成为第1列,第2列为偶数行(第1列为空白)成为第2列。以" all"开头的行被删除。

这是输出文件的外观:

-----输出文件的开始----

Ex8_inner 25425
Ex8_inner 25426
Ex9_inner 25427
Ex9_inner 25428
Ex10_inner 30935
Ex10_inner 31584

-----输出文件结束----

2 个答案:

答案 0 :(得分:0)

编辑: 由于OP已将Input_file示例更改了一点,因此也添加了代码。

awk --re-interval 'match($0,/Exon[0-9]{1,}/){val=substr($0,RSTART,RLENGTH);getline;sub(/^ +/,"",$1);print val,$1}'   Input_file

注意: 我的awk是旧版本,我添加了--re-interval您无需添加它以防您有最新版本它也是。

单个awk以下内容也可以帮助您。

awk '/Ex[0-9]+_inner/{val=$NF;getline;sub(/^ +/,"",$1);print val,$1}'  Input_file

说明: 此处也添加说明。

awk '
/Ex[0-9]+_inner/{    ##Checking condition here if a line contains string Ex then digits _inner if yes then do following actions.
   val=$NF;          ##Creating variable named val whose value is $NF(last field of current line).
   getline;          ##using getline which is out of the box keyword of awk to take the cursor to the next line from current line.
   sub(/^ +/,"",$1); ##Using sub utility of awk to substitute initial space of first field with NULL.
   print val,$1      ##Printing variable named val and first field value here.
}
' Input_file         ##Mentioning the Input_file name here.

答案 1 :(得分:0)

另一个awk

$ awk '/^all/{next} 
      !/^chr/{printf "%s\n", $1; next} 
             {printf "%s ", $NF}' file

Ex8_inner 25425
Ex8_inner 25426
Ex9_inner 25427
Ex9_inner 25428
Ex10_inner 30935
Ex10_inner 31584

或者

$ awk '!/^all/{if(/^chr/) printf "%s", $NF OFS; else print $1}' file