web-dev-qa-db-ja.com

Unixシェルを使用して最初のn列と最後のn列のみを表示する方法

多くのcsvファイルがあります。元のデザインには5つの列があるはずでした。

Csvファイルの中央の列に任意の数のコンマが含まれた文字列があり、適切に引用されていないことがわかりました。これは、任意の数の列を持つ行につながります。

これらのcsvファイルの最初の2列と最後の2列だけを取得するにはどうすればよいですか?

コンマの数は行ごとに変わる可能性があるため、最初の2列と最後の2列を指定する方法が必要です。

awk -F, '{print $1, $2, $(NF-1), $NF}'  < input

より一般的に(質問のタイトルに従って)入力の最初と最後のn列を印刷します-一部の列を2回印刷することを意味するかどうかを確認せずに-

awk -v n=2 '{ 
  for(i=1; i <= n && i <= NF; i++)
      printf "%s%s", $i, OFS
    for(i=NF-n+1; i <= NF && i >= 1; i++)
      printf "%s%s", $i, OFS
    printf "%s", ORS
  }' < input

(区切り文字に必要に応じて-Fを使用)

13
Jeff Schaller

Perl:

echo a,b,X,X,X,X,c,d | Perl -F, -slane 'print join ",", @F[0..$n-1, -$n..-1]' -- -n=2
a,b,c,d
1
glenn jackman

このsedも使えます

sed -E 's/(([^,]*,){2}).*((,[^,]*){2})/\1\3/;s/,,/,/'
1
ctac_