web-dev-qa-db-ja.com

AWK-列の範囲を印刷する

次の形式のcsvファイルがある場合:

column1,column2,column3,column4,column5,column6,column7,column8

awkに2から7までの列だけを印刷して、

awk -F',' '{print $2 "," $3 "," $4 "," $5 "," $6 "," $7}' file.csv

そして得る:

column2,column3,column4,column5,column6,column7

コマンドを簡略化するために列2〜7を連結する方法はありますか。列がかなり多いファイルを考えているので、awkコマンドは恐ろしく長くなります。

1
nath
$ awk -v b=2 -v e=7 'BEGIN{FS=OFS=","} {for (i=b;i<=e;i++) printf "%s%s", $i, (i<e ? OFS : ORS)}' file
column2,column3,column4,column5,column6,column7

b =開始フィールド番号、e =終了フィールド番号。引用符で囲まれたフィールド、埋め込まれたコンマ、改行などでCSVを処理する必要がある場合は、 https://stackoverflow.com/q/45420535/1745001 を参照してください。

3
Ed Morton

ユーティリティカットの表記はコンパクトです。

cut -d, -f2-7 <input-file>

生産:

column2、column3、column4、column5、column6、column7

8
drl
sed -e '
  s/,/\n/7        ;# tag the end of col7
  s/^/,/          ;# add a comma
  s/,/\n/2        ;# tag beginning of col2
  s/.*\n\(.*\)\n.*/\1/ ;# perform surgery 
' file.csv

結果:

column2,column3,column4,column5,column6,column7
2
Rakesh Sharma

以下のコマンドでテストし、それはうまくいきました

awk -F "," 'OFS=","{$1="";$NF="";print $0}' o| sed "s/^,//g"|sed "s/,$//g"

出力

column2,column3,column4,column5,column6,column7
0