AWK - 열 범위 인쇄

AWK - 열 범위 인쇄

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

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

열 2부터 열 7까지만 인쇄 하고 싶습니다 awk. 다음을 사용합니다.

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

그리고 얻다:

column2,column3,column4,column5,column6,column7

명령을 단순화하기 위해 열 2-7을 연결하는 방법이 있습니까? 더 많은 열이 있는 파일을 고려하면 명령 awk이 매우 길어집니다.

답변1

실용적인 전단에는 다음과 같은 간결한 표기법이 있습니다.

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

생산:

2열, 3열, 4열, 5열, 6열, 7열

@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 코드 recut을 약간 수정한 반면, alignment는 확장된 컷 버전입니다. 추가 정보:

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

답변2

$ 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.

답변3

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

답변4

이것은 나에게 효과적입니다.

awk '{ for (i=2; i<=7;i++){ printf $i; if (i != 7){ printf "," }} print "" }'

적은 수의 열에 대해서는 (명령 복잡성 측면에서) 의미가 없습니다. 그러나 이 접근 방식은 입력에 열이 많은 경우 유용합니다.

관련 정보