![4자리가 발견되면 csv로 숫자와 다음 줄 값을 인쇄합니다.](https://linux55.com/image/167423/4%EC%9E%90%EB%A6%AC%EA%B0%80%20%EB%B0%9C%EA%B2%AC%EB%90%98%EB%A9%B4%20csv%EB%A1%9C%20%EC%88%AB%EC%9E%90%EC%99%80%20%EB%8B%A4%EC%9D%8C%20%EC%A4%84%20%EA%B0%92%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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