CSV 파일이 있는데 세 번째 세미콜론부터 자르고 싶습니다. 예를 들어 다음 파일이 있는 경우:
1;foo;bar;baz;x;y;z
2;foo;bar;baz;x;y;z
3;foo;bar;baz;x;y;z
다음 출력을 얻고 싶습니다.
1;foo;bar
2;foo;bar
3;foo;bar
이를 달성하기 위해 어떤 Unix 명령을 사용할 수 있는지 모르겠습니다. 어떤 제안이 있나요?
이 작업은 KSH 스크립트에서 수행됩니다.
답변1
다양성을 위해 또 다른 접근 방식이 있습니다 cut
.
cut -d \; -f -3
답변2
이렇게 하면 귀하가 요청한 작업이 수행됩니다.
awk -F';' '{print $1 ";" $2 ";" $3;}' <input >output
이 awk
유틸리티는 이 작업을 위해 설계되었습니다. 개별 행을 필드로 쉽게 분할한 다음 이를 기반으로 작업할 수 있습니다. 매개변수는 필드 구분자 로 사용하도록 -F';'
지시합니다 . 따옴표가 없으면 쉘은 이를 명령 구분 기호로 해석하므로 따옴표가 필요합니다 .awk
;
;
실행을 위해 awk에 제공된 명령의 각 행(비트)도 인용되어 모든 흥미로운 문자( , 및 이 경우)가 셸에서 특별하게 처리되는 것을 '{print $1 ";" $2 ";" $3;}'
방지 하고 전체 문자가 단일 문자로 전달되도록 합니다. 단위.{
}
$
"
;
awk
물론 명령의 입력과 출력을 파일로 리디렉션하기 위해 쉘에 제공되는 리디렉션 지침입니다 <input
.>output
답변3
쉘에 의존하지 않는 awk를 사용하여 이 작업을 수행할 수 있습니다. 출력을 임시 파일에 쓴 다음 이를 기존 파일 위로 이동해야 합니다.
awk -F';' 'BEGIN { OFS=";" } { print $1,$2,$3 }' file.txt > newfile.txt
mv newfile.txt file.txt
답변4
펄 사용하기
~$ perl -lane ' @F = split(";"); print join ";", @F[0..2];' file
음악을 활용하세요(이전 Perl_6)
$~ raku -ne 'my @F = .split(";"); put join ";", @F[0..2];' file
Perl과 Raku를 사용한 두 가지 답변은 다음과 같습니다. 데이터를 한 줄씩 읽으려면 Perl -lane
또는 Raku의 비자동 인쇄 플래그를 사용하십시오. -ne
(차이점은 Raku가 -l
기본적으로 자동 자르기를 수행하지만 Raku에는 해당 플래그가 없다는 것입니다 -a
.)
이후 코드는 사실상 동일합니다. Raku에서는 @F
(or @G
, or @H
배열 등) 을 선언하려면 or (범위 설명자)를 사용해야 합니다 . 라쿠도 표시해 달라고 부탁해요my
our
무엇호출 중인 객체 split
( 읽을 때 개별 데이터 행을 보유하는 .split
테마 변수의 $_.split
약자 )입니다.$_
결국 print
(Perl) 또는 put
(Raku)를 선택해야 합니다. Raku print
에도 있지만 put
개행 문자가 추가됩니다.
입력 예:
1;foo;bar;baz;x;y;z
2;foo;bar;baz;x;y;z
3;foo;bar;baz;x;y;z
예제 출력:
1;foo;bar
2;foo;bar
3;foo;bar
펄 참조:
https://perldoc.perl.org
https://www.perl.org
Leku 참고 자료:
https://docs.raku.org
https://raku.org