我有一个包含 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
-w
id1
id11
cut -f 1
tr '\n' ','
sed -e 's/,$//' -e 's/^,//'
cut
也许首先单独运行内部管道作为计数器检查 - 多余的列索引不会影响结果。