4자리가 발견되면 csv로 숫자와 다음 줄 값을 인쇄합니다.

4자리가 발견되면 csv로 숫자와 다음 줄 값을 인쇄합니다.

CSV 형식의 데이터가 있습니다.

125867569,98652343,7012,879456217,20121221,7065,758964231,856421345   

내가 원하는 출력:

7012,879456217,7065,758964231  

어떻게 해야 하나요?

답변1

다음과 같은 작업이 수행됩니다.

awk -F, '{for (i=1;i<NF-1;i++) if (length($i)==4 && int($i)==$i) printf("%s,%s,", $i,$(i+1))}' input_file

,불필요한 내용을 제거 하고 출력에 줄바꿈을 추가 하는 "절대 과잉" 버전을 원한다면 다음을 시도해 보십시오.

awk -F, '{if (g) printf("\n"); f=0; for (i=1;i<NF-1;i++) if (length($i)==4 && int($i)==$i) {if (f) printf(","); else f=1; printf("%s,%s", $i,$(i+1)); g=1}} END{if (g) printf("\n")}' input_file

답변2

파일에 따옴표나 개행 문자가 포함되어 있지 않으면 다음을 사용할 수 있습니다 cut.

cut -d, -f3,4,6,7 file.csv
  • -d구분 기호 지정
  • -f출력할 열 지정

답변3

ruby -rcsv -e '
  CSV.foreach(ARGV.shift) do |row|
    puts row.each_cons(2)
            .select {|pair| pair.first =~ /^\d{4}$/}
            .flatten
            .to_csv
  end
' file.csv

답변4

다음과 같은 다양한 방법으로 이 작업을 수행할 수 있습니다.

방법 1: GNU sed(확장 정규식 활성화)

설명: 먼저 패턴 공간의 시작 부분에 토큰을 배치하세요. 오른쪽에 있는 두 필드를 보고 오른쪽에 4자리 숫자가 보이면 마커가 오른쪽으로 두 필드를 점프하도록 만듭니다. OTW, 마크가 필드를 점프하도록 만들고 패턴 공간에서 필드를 제거합니다. 토큰이 패턴 공간의 끝에 도달하면 이 프로세스가 중지됩니다. 이 시점에서 패턴 공간에 남은 것은 답이다.

$ sed -re '
     s/^/\n/
     :a;/\n$/!{
       s/\n([0-9]{4},[^,]+(,|$))/\1\n/;ta
       s/\n[^,]+(,|$)/\n/;ta
      }
      s/,?\n$//;/./!d
 ' file.csv

$ perl -F, -lane '$,=",";
    print  /(?:^|,)(\d{4},[^,]+)/g;
' file.csv 

$ perl -F, -lane '$,=",";
    shift(@F) =~ /^(\d{4})$/
      and push(@A, $1, shift(@F))
        while @F > 1;
    print splice @A if @A;
' file.csv

$ awk -F, -vOFS=, '{
    N = split($0, a, FS)
    $0 = ""
    for ( i=j=1; i<N; )
      if ( a[i] ~ /^[0-9]{4}$/ )
        for ( k=0; k<2; k++ )
          $(j++) = a[i++]
      else
        ++i
  }NF' file.csv

관련 정보