我有一个空格分隔的文件,我想将其转换为制表符分隔文件。该文件如下所示:
pos peptide logscore affinity(nM) Bind Level Protein Name Allele
0 GPSGGQPX 0.075 22266 1 HLA-A11:01
0 PSGGQPXA 0.071 23285 2 HLA-A11:01
0 SGGQPXAL 0.076 21945 3 HLA-A11:01
0 GGQPXALD 0.076 21858 4 HLA-A11:01
0 GQPXALDS 0.075 22237 5 HLA-A11:01
0 QPXALDSG 0.073 22748 6 HLA-A11:01
0 PXALDSGY 0.072 22962 7 HLA-A11:01
0 XALDSGYD 0.080 21133 8 HLA-A11:01
0 DTSMKDMH 0.093 18194 9 HLA-A11:01
0 TSMKDMHK 0.732 18 SB 10 HLA-A11:01
0 SMKDMHKV 0.099 17148 11 HLA-A11:01
0 MKDMHKVL 0.071 23175 12 HLA-A11:01
0 KDMHKVLR 0.135 11550 13 HLA-A11:01
0 DMHKVLRT 0.074 22537 14 HLA-A11:01
0 MHKVLRTL 0.072 23056 15 HLA-A11:01
0 HKVLRTLQ 0.069 23819 16 HLA-A11:01
0 DTSMKDMH 0.093 18194 17 HLA-A11:01
0 TSMKDMHK 0.732 18 SB 18 HLA-A11:01
0 SMKDMHKV 0.099 17148 19 HLA-A11:01
0 MKDMHKVL 0.071 23175 20 HLA-A11:01
我必须用一个标签替换空格,并考虑到:
因此,仅仅以下内容还不够:
awk '{$1=$1}1' OFS="\t" file
有没有一种简单的方法可以用单线程来实现这一点,最好是awk?
修改
这是输出的样子,注意" Bind.Level"和" Protein.Name"在标题中," - " (在空Bind.Level记录中可以是NA或"")
pos peptide logscore affinity(nM) Bind.Level Protein.Name Allele
0 GPSGGQPX 0.075 22266 - 1 HLA-A11:01
0 PSGGQPXA 0.071 23285 - 2 HLA-A11:01
0 SGGQPXAL 0.076 21945 - 3 HLA-A11:01
0 GGQPXALD 0.076 21858 - 4 HLA-A11:01
0 GQPXALDS 0.075 22237 - 5 HLA-A11:01
0 QPXALDSG 0.073 22748 - 6 HLA-A11:01
0 PXALDSGY 0.072 22962 - 7 HLA-A11:01
0 XALDSGYD 0.080 21133 - 8 HLA-A11:01
0 DTSMKDMH 0.093 18194 - 9 HLA-A11:01
0 TSMKDMHK 0.732 18 SB 10 HLA-A11:01
0 SMKDMHKV 0.099 17148 - 11 HLA-A11:01
0 MKDMHKVL 0.071 23175 - 12 HLA-A11:01
0 KDMHKVLR 0.135 11550 - 13 HLA-A11:01
0 DMHKVLRT 0.074 22537 - 14 HLA-A11:01
0 MHKVLRTL 0.072 23056 - 15 HLA-A11:01
0 HKVLRTLQ 0.069 23819 - 16 HLA-A11:01
0 DTSMKDMH 0.093 18194 - 17 HLA-A11:01
0 TSMKDMHK 0.732 18 SB 18 HLA-A11:01
0 SMKDMHKV 0.099 17148 - 19 HLA-A11:01
0 MKDMHKVL 0.071 23175 - 20 HLA-A11:01
请注意,非空Bind.Level记录可能采用不同的值,而不仅仅是" SB" ...但所有这些都是字母... Protein.Name可能并不总是数字,但..
这类似于识别由\ s +分隔的字段;然后,如果有7个字段,则打印它们(由制表符分隔),如果有6个(Bind.Level为空),则打印$ 1,$ 2,$ 3,$ 4," - ",$ 5 ,6美元。 Protein.names可能包含空格,但我要确保它们不是(它们是输入)。这应该是超级简单的,但我不知道怎么做......任何人?
答案 0 :(得分:0)
以下是使用gnu awk
awk -vFIELDWIDTHS="4 17 13 14 16 13" '{for (i=1;i<=NF;i++) gsub(/ +|\t+/,"",$i);$5=$5?$5:"-";print }' file
pos peptidel ogscoreaffin ity(nM)BindL evelProtein NameAlle
0 GPSGGQPX 0.075 22266 - 1HLA-A11:01
0 PSGGQPXA 0.071 23285 - 2HLA-A11:01
0 SGGQPXAL 0.076 21945 - 3HLA-A11:01
0 GGQPXALD 0.076 21858 - 4HLA-A11:01
0 GQPXALDS 0.075 22237 - 5HLA-A11:01
0 QPXALDSG 0.073 22748 - 6HLA-A11:01
0 PXALDSGY 0.072 22962 - 7HLA-A11:01
0 XALDSGYD 0.080 21133 - 8HLA-A11:01
0 DTSMKDMH 0.093 18194 - 9HLA-A11:01
0 TSMKDMHK 0.732 18 SB 10HLA-A11:01
0 SMKDMHKV 0.099 17148 - 11HLA-A11:01
0 MKDMHKVL 0.071 23175 - 12HLA-A11:01
0 KDMHKVLR 0.135 11550 - 13HLA-A11:01
0 DMHKVLRT 0.074 22537 - 14HLA-A11:01
0 MHKVLRTL 0.072 23056 - 15HLA-A11:01
0 HKVLRTLQ 0.069 23819 - 16HLA-A11:01
0 DTSMKDMH 0.093 18194 - 17HLA-A11:01
0 TSMKDMHK 0.732 18 SB 18HLA-A11:01
0 SMKDMHKV 0.099 17148 - 19HLA-A11:01
0 MKDMHKVL 0.071 23175 - 20HLA-A11:01
或
awk -vFIELDWIDTHS="4 17 13 14 16 13" '{for (i=1;i<=NF;i++) gsub(/ +|\t+/,"",$i);$5=$5?$5:"-";print}' file | column -t
pos peptidel ogscoreaffin ity(nM)BindL evelProtein NameAlle
0 GPSGGQPX 0.075 22266 - 1HLA-A11:01
0 PSGGQPXA 0.071 23285 - 2HLA-A11:01
0 SGGQPXAL 0.076 21945 - 3HLA-A11:01
0 GGQPXALD 0.076 21858 - 4HLA-A11:01
0 GQPXALDS 0.075 22237 - 5HLA-A11:01
0 QPXALDSG 0.073 22748 - 6HLA-A11:01
0 PXALDSGY 0.072 22962 - 7HLA-A11:01
0 XALDSGYD 0.080 21133 - 8HLA-A11:01
0 DTSMKDMH 0.093 18194 - 9HLA-A11:01
0 TSMKDMHK 0.732 18 SB 10HLA-A11:01
0 SMKDMHKV 0.099 17148 - 11HLA-A11:01
0 MKDMHKVL 0.071 23175 - 12HLA-A11:01
0 KDMHKVLR 0.135 11550 - 13HLA-A11:01
0 DMHKVLRT 0.074 22537 - 14HLA-A11:01
0 MHKVLRTL 0.072 23056 - 15HLA-A11:01
0 HKVLRTLQ 0.069 23819 - 16HLA-A11:01
0 DTSMKDMH 0.093 18194 - 17HLA-A11:01
0 TSMKDMHK 0.732 18 SB 18HLA-A11:01
0 SMKDMHKV 0.099 17148 - 19HLA-A11:01
0 MKDMHKVL 0.071 23175 - 20HLA-A11:01
通过这种方式,您可以按照自己的方式对其进行格式化,因为您可以控制哪些字段的大小。
答案 1 :(得分:0)
分2步完成,第一步在空Binding.Level记录和“。”中添加“ - ”。在正确的标题名称中,以及从空格更改为制表符的第二步:
awk 'BEGIN{FS="";OFS=FS};($50==" "){$50="-"};(NR==1){$47="."; $64="."}{print}' file > out1
awk '{$1=$1}1' OFS="\t" out1 > out2