Unix Shell을 사용하여 처음 n 열과 마지막 n 열만 표시하는 방법은 무엇입니까?

Unix Shell을 사용하여 처음 n 열과 마지막 n 열만 표시하는 방법은 무엇입니까?

csv 파일이 많습니다. 원래 디자인에는 5개의 열이 있어야 했습니다.

방금 csv 파일의 중간 열에 임의 개수의 쉼표가 포함되어 있고 올바르게 인용되지 않은 문자열이 있다는 것을 발견했습니다. 결과적으로 열 개수에 관계없이 행이 생성됩니다.

이 csv 파일의 처음 두 열과 마지막 두 열을 어떻게 얻을 수 있습니까?

쉼표의 개수는 행마다 바뀔 수 있으므로 처음 두 열과 마지막 두 열을 지정하는 방법이 필요합니다.

답변1

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

보다 일반적으로 (질문 제목에 따라) n입력의 첫 번째 열과 마지막 열을 인쇄합니다. 이것이 일부 열을 두 번 인쇄한다는 의미인지 확인하지 않고-

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필요에 따라 구분 기호를 사용하십시오)

답변2

진주:

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

답변3

이 sed를 사용할 수도 있습니다

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

관련 정보