刪除檔案 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

也許首先單獨運行內部管道作為計數器檢查 - 多餘的列索引不會影響結果。

相關內容