次のように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