cutコマンドのフィールドオプションに変数を渡す方法(bash)

cutコマンドのフィールドオプションに変数を渡す方法(bash)

2500列と3000行のタブ区切りファイルがあります。ヘッダーに基づいて特定の列を抽出したいと思います。ところで、これはwhileループで行われるため、毎回異なる列名が選択されます。

ファイル形式の例:

a     b    c    d    e     f     g    h   
xy    1    2    f    21    4     5    6
qu    9    10   z    50    12    7    8

希望の出力:

a     b    c    d    g 
xy    1    2    f    5
qu    9    10   z    7

列番号を識別し、その番号を変数として保存し、-fの下のカットに渡すつもりです。たとえば、「g」列を選択した場合、これは7番目のフィールドです。

colNum=$(head -1 file.txt | tr '\t' '\n' | cat -n | grep "g" | cut -f 1)
cut -f1,2,3,4,"$colNum" file.txt > new_file.txt

次のエラーが発生します。

cut: fields and positions are numbered from 1
Try 'cut --help' for more information.

ベストアンサー1

コメントでは、回答を含める必要はないことに同意しましたcut。私はGNU Datamash(https://www.gnu.org/software/datamash/)はこの問題をエレガントに解決します。

問題のサンプル入力をというファイルに入れて、data.txtdatamashを使用してそれを処理する例を実行しました。

$ datamash -HW cut a,b,c,d,g < data.txt
cut(a)  cut(b)  cut(c)  cut(d)  cut(g)
xy      1       2       f       5
qu      9       10      z       7

ヘッダーにジョブ名を追加したくない場合は、一部の後処理で少しクリーンアップできます。

$ datamash -HW cut a,b,c,d,g < data.txt | sed 's/cut(\([^[:space:]]*\))/\1/g'
a       b       c       d       g
xy      1       2       f       5
qu      9       10      z       7

おすすめ記事