删除文件 A 中包含文件 B 中的字段名称的整列

删除文件 A 中包含文件 B 中的字段名称的整列

我有一个包含 500 列的文件。我需要删除一些列,这些列的名称在另一个文件的列表中进行了描述。例如

fileA

    id1 id22 id43 id4 id5 id6 id7 id68 id9 id10 id11 
    TT AA AG TC TT AA AG TC DD AA CC     
    TT AC GG TC TT AG AG TC AD AA DC 

fileB

    id1
    id5
    id10
    id68

期望的输出:

         id22 id43 id4 id6 id7 id9 id11 
           AA AG TC AA AG DD CC     
           AC GG TC AG AG AD DC  

答案1

我不知道你是否想将其称为单行,但你可以使用非常基本的工具即时完成:

cut -d' ' -f $(head -n 1 fileA | tr -s ' ' '\n' | cat -n | grep -wvf fileB | cut -f 1 | tr '\n ' ',' | sed -e 's/,$//' -e 's/^,//') fileA

解释:

cut命令cut -d' ' -f [...] fileA只是使用空格作为分隔符-d' ',并选择要保留的字段-f。然后是使用哪些字段/列的问题,这些字段/列由我们动态创建的逗号分隔索引列表给出:

head -n 1 fileA仅选择标题行,tr -s ' ' '\n'将所有空格更改为换行符(并将-s多次出现的空格压缩为单个空格),cat -n将行号添加到此列表中。

这些行号与原始列号相同,因此我们需要选择剩余的行号。我们对删除列表中的标头grep -wvf fileB进行反向ping(用于确保eg不会同时删除),然后将此列表仅指向行号,并将换行符转换为逗号 ( ),从而为我们提供逗号分隔的列表剩余列数。但是在最后一步中,列表前后仍然有逗号,因此我们需要使用 删除它们。现在,outer的字段列表已完成。grep-wid1id11cut -f 1tr '\n' ','sed -e 's/,$//' -e 's/^,//'cut

也许首先单独运行内部管道作为计数器检查 - 多余的列索引不会影响结果。

相关内容