
我有一個包含 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
也許首先單獨運行內部管道作為計數器檢查 - 多餘的列索引不會影響結果。