ファイル B のフィールド名を含むファイル A の列全体を削除します。

ファイル B のフィールド名を含むファイル A の列全体を削除します。

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複数の出現を 1 つにまとめ)、cat -nこのリストに行番号を追加します。

これらの行番号は元の列番号と同じなので、残りの行番号を選択する必要があります。 を使用して、削除リストのヘッダーに対してgrep -wvf fileB逆の ping を実行し(を使用して、たとえば がも削除されないようにします)、このリストを行番号のみに変換し、改行をカンマに変換して ( )、残りの列のカンマ区切りリストを作成します。ただし、最後のステップでは、リストの前後にまだカンマが残っているので、 を使用して削除する必要があります。これで、外側の のフィールド リストが完成しました。grep-wid1id11cut -f 1tr '\n' ','sed -e 's/,$//' -e 's/^,//'cut

最初にカウンターチェックとして内部パイプを個別に実行します。余分な列インデックスは結果に影響しません。

関連情報