AWK-열 범위 인쇄

다음 형식의 csv 파일이있는 경우 :

column1,column2,column3,column4,column5,column6,column7,column8 

awk에서 2 ~ 7 열만 인쇄하고 싶습니다.

awk -F"," "{print $2 "," $3 "," $4 "," $5 "," $6 "," $7}" file.csv 

및 get :

column2,column3,column4,column5,column6,column7 

2-7 열을 연결하여 명령을 단순화하는 방법이 있습니다. 열이 상당히 많은 파일을 생각할 때 awk 명령이 너무 길어질 것입니다.

댓글

  • 항상 연속 된 열 집합 (예 : 2-7 또는 5-15 등)을 원하십니까? 그렇다면 루프를 사용하여 열을 인쇄 할 수 있습니다. 그렇지 않은 경우에는 '는 원하는 개별 열을 나열하는 것을 피하지 않습니다 (필요한 경우 일부 루프에서 혼합 할 수 있음). 또한 열 수는?
  • 마지막으로 원할 수 있습니다. 좋은 CSV 파서가있는 perl 또는 python과 같은 언어를 고려하기 위해 …. 특히 첫 줄에 열 이름이있는 경우 (perl '의 CSV 파싱 모듈 중 열 이름을 키로 사용하여 해시를 구성합니다. python '의 CSV 파서도 유사하게 수행 할 수 있습니다. perl 또한 우수한 배열 & 해시 스 플라이 싱 연산자가 있습니다.
  • @cas 예 열은 alwa가됩니다. ys 연속.
  • 이 질문에 대한 답이 되었습니까? 열 범위를 쉼표로 구분하고 나머지는 쉼표로 구분하지 않고 인쇄

답변

$ awk -v b=2 -v e=7 "BEGIN{FS=OFS=","} {for (i=b;i<=e;i++) printf "%s%s", $i, (i<e ? OFS : ORS)}" file column2,column3,column4,column5,column6,column7 

b = 시작 필드 번호, e = 끝 필드 번호. 인용 필드, 쉼표, 줄 바꿈 등이 포함 된 CSV를 처리해야하는 경우 https://stackoverflow.com/q/45420535/1745001 를 참조하세요.

p>

답변

유틸리티 컷에는 간결한 표기법이 있습니다.

cut -d, -f2-7 <input-file> 

생성 :

column2, column3, column4, column5, column6, column7

@PlasmaBinturong의 댓글에 답하기 : 내 의도는 짧은 호출 시퀀스 문제를 해결하는 것이 었습니다. " … 내 awk 명령이 끔찍하게 길어질 것입니다 … ". 그러나 원하는대로 필드를 배열하는 코드를 찾을 수도 있습니다. 내가 awk, perl, python을 좋아하는만큼 표준 * nix의 기능을 확장하기위한 특정 유틸리티를 빌드하는 것이 유용하다는 것을 자주 발견했습니다. 따라서 다음은 테스트 스크립트 s2에서 발췌 한 것입니다. 유틸리티 재 절단 및 정렬을 보여줍니다. 둘 다 재 배열 및 복제를 허용하고 정렬은 필드 범위 감소도 허용합니다.

FILE=${1-data1} # Utility functions: print-as-echo, print-line-with-visual-space. pe() { for _i;do printf "%s" "$_i";done; printf "\n"; } pl() { pe;pe "-----" ;pe "$*"; } pl " Input data file $FILE:" head $FILE pl " Results, cut:" cut -d, -f2-7 $FILE pl " Results, recut (modified as my-recut):" my-recut -d "," 7,6,2-5 < $FILE pl " Results, arrange:" arrange -s "," -f 5,3-1,7,5,3-4,5 $FILE 

다음 버전에서 결과 생성 :

OS, ker|rel, machine: Linux, 3.16.0-10-amd64, x86_64 Distribution : Debian 8.11 (jessie) bash GNU bash 4.3.30 cut (GNU coreutils) 8.23 recut - ( local: RepRev 1.1, ~/bin/recut, 2010-06-10 ) arrange (local) 1.15 ----- Input data file data1: column1,column2,column3,column4,column5,column6,column7,column8 ----- Results, cut: column2,column3,column4,column5,column6,column7 ----- Results, recut (modified as my-recut): column7,column6,column2,column3,column4,column5 ----- Results, arrange: column5,column3,column2,column1,column7,column5,column3,column4,column5 

my-recut은 textutils 코드를 다시 잘라낸 약간의 수정이며, array는 확장 된 컷의 버전입니다. . 추가 정보 :

recut Process fields like cut, allow repetitions and re-ordering. (what) Path : ~/bin/recut Version : - ( local: RepRev 1.1, ~/bin/recut, 2010-06-10 ) Length : 56 lines Type : Perl script, ASCII text executable Shebang : #!/usr/bin/perl Home : http://www1.cuni.cz/~obo/textutils/ (doc) Modules : (for perl codes) Getopt::Long 2.42 arrange Arrange fields, like cut, but in user-specified order. (what) Path : ~/bin/arrange Version : 1.15 Length : 355 lines Type : Perl script, ASCII text executable Shebang : #!/usr/bin/perl Modules : (for perl codes) warnings 1.23 strict 1.08 Carp 1.3301 Getopt::Euclid 0.4.5 

건배, drl

댓글

  • Awk와는 달리 명령 순서가 아닌 입력 파일의 순서로 열을 출력합니다.
  • @PlasmaBinturong-편집 된 답변 참조 … 응원

답변

sed -e " s/,/\n/7 ;# tag the end of col7 s/^/,/ ;# add a comma s/,/\n/2 ;# tag beginning of col2 s/.*\n\(.*\)\n.*/\1/ ;# perform surgery " file.csv 

결과 :

column2,column3,column4,column5,column6,column7 

답변

아래 명령으로 테스트했으며 정상적으로 작동했습니다.

awk -F "," "OFS=","{$1="";$NF="";print $0}" o| sed "s/^,//g"|sed "s/,$//g" 

출력

column2,column3,column4,column5,column6,column7 

댓글

  • 답변에 감사하며 " o " 첫 번째 sed 파이프 앞에 🙂 두 개의 sed 명령을 하나로 연결할 수 있습니다. sed "s/^,//g; s/,$//g"

라인을 인쇄할지 여부를 결정 하시겠습니까? 다른 문제도 있지만 (예 : awk를 사용할 때 sed 명령에 파이프가 필요하지 않습니다. '!) OFS 테스트 부분은 전혀 의미가 없습니다 …

  • @EdMorton I ' 아직 유일한 awk 해결책을 기대하고 있습니다 …
  • @nath 이유 ? @drl이 게시 cut 솔루션의 ' 문제점 ?
  • @EdMorton 아니, 맞습니다. 잘 작동합니다. 나는 그것이 awk로 너무 복잡 할 수 없다고 생각했고 오히려 기술적 이유 때문에 관심의 문제에 대해 호기심이 많았습니다 🙂
  • 답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다