
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
-w
id1
id11
cut -f 1
tr '\n' ','
sed -e 's/,$//' -e 's/^,//'
cut
最初にカウンターチェックとして内部パイプを個別に実行します。余分な列インデックスは結果に影響しません。