awkを使用してcsvから特定の列を削除する

awkを使用してcsvから特定の列を削除する

次のようにcsv形式の列を取得できます。

、列1、列2、列3、列4、列5、、

awkコマンドを使用して、次の形式で出力を取得します。

awk -vORS=, '$0 && p {print $2}; $2 == "name" {p=1} '`

次に、次の2つのコマンドを使用して、前と後の2つのカンマを削除しました。

   cols=${cols:1}
   cols=${cols:0:${#cols}-2}

これで、次の形式で出力されます。

列1、列2、列3、列4、列5

右のリストに一致する特定の列を削除したいです。たとえば、「col4、col5」パラメータを使用して関数を呼び出すと、awkは最後の2つの列を削除し、次のように出力を印刷する必要があります。

列1、列2、列3

シェルスクリプトでこれをどのように実行できますか? (好ましくは、awkまたはgrepまたはそのシェルでサポートされている他のコマンドを使用して)?

更新:初期ファイルの内容は、次のように表形式で出力されます。

+-----------------------------------------+--------+---------+
| name                                    | type   | comment |
+-----------------------------------------+--------+---------+
| col1                                    | int    |         |
| col2                                    | int    |         |
| col3                                    | string |         |
| col4                                    | string |         |
| col5                                    | string |         |
+-----------------------------------------+--------+---------+

ベストアンサー1

Cutを使用して、区切られたデータから特定の列を抽出できます。たとえば、次は最後の2つの列を抽出します。

echo col1,col2,col3,col4,col5 | cut -d , -f 4,5

印刷

col4,col5

-dパラメーターは区切り文字を指定し、-fは結果に表示する結果フィールドの索引または索引範囲を指定します。

編集する

より動的にするには、以下では、Y区切り文字に基づいて最後のX列を選択します。

function lastCols {
        endcol=$(($(head -n 1 $1 | grep -o , | wc -l) + 1))
        startcol=$(($endcol-$2+1))
        cut -d $3 -f $startcol-$endcol < $1
}

lastCols $1 $2 $3

これについて多くのテストを実行していないため、問題がある可能性があります。次のように使用してください。

[]$ cat temp.txt
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5

[]$ ./lastCols.sh temp.txt 2 ,
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5

おすすめ記事