두 개의 필드가 있는 약 16,000줄 길이의 csv 파일이 있습니다. 첫 번째 필드에는 값 목록이 포함되고 두 번째 필드에는 세미콜론으로 구분된 이름 및 이름 목록이 포함됩니다.
3, Jack Mackie; Hanna Jones; Mike Freeland; Ollie Downs; Farrah Anderson; Judy John
9, Jewel Woodley; Jean Sullivan; Marcia Robin; Kerry Morton; Joelle Armour; Zakiya Pulwarty; Karen Thornhill; Shurm Ahmet; Ed Aslan; Adam Condell; Zeliha Manners; Joan Johnson
5, Haydn Smart; Andre Henry; Tamara Brownbill; Kelly Withers; Eden Anderson; Naomi Casa; Azaria Amritt; Jamile Newton; Nabahe Durand
첫 번째 필드의 숫자 위치에 해당하는 두 번째 필드에 나열된 이름은 팀 리더입니다. 예를 들어 첫 번째 행의 팀 리더는 Mike Freeland(위치 3)이고 두 번째 행의 팀 리더는 Ed입니다. 아슬란(9위), 세 번째 줄은 에덴 앤더슨(5위)이다. 모든 팀 리더의 이름을 추출해야 합니다.
팀 리더의 이름을 모두 추출하고 이를 내 csv 파일에 대해 실행한 다음 새 파일로 출력하는 셸 스크립트를 작성하려고 합니다.
정보를 찾기 위해 "grep" 또는 "awk"와 "FS"(FS는 공백 대신 세미콜론을 구분 기호로 지정)를 사용하는 방법을 조사했지만 해당 값을 첫 번째 필드에 통합하는 방법을 모르겠습니다. 선택 기준으로 . 내가 본 모든 예는 알려진 값이나 문자열을 검색하기 위해 이러한 명령을 사용합니다. 하지만 이 경우에는 값의 위치(이름과 성)만 알 수 있습니다. 올바른 명령을 찾고 있습니까?
나는 대본을 생각해 내지 못했습니다. 팀장의 이름을 추출하는 방법은 무엇입니까?
답변1
$ awk -F, '{split($2,names,";"); print names[$1]}' file.csv
Mike Freeland
Ed Aslan
Eden Anderson
답변2
$ awk -F'[,;] ' '{print $($1 + 1)}' file
Mike Freeland
Ed Aslan
Eden Anderson
필드 구분 기호를 '[,;] '
쉼표 또는 세미콜론 뒤에 공백 문자로 변경합니다. 그런 다음 첫 번째 필드의 값을 가져와 $1
하나를 추가하고 해당 필드의 값을 인쇄합니다 $(...)
.
답변3
사용밀러( mlr
)그리고 입력 데이터에 빈 행이 없다고 가정합니다.
$ mlr --csv -N put -q 'print clean_whitespace(splita($2, ";")[$1])' file
Mike Freeland
Ed Aslan
Eden Anderson
이렇게 하면 unheader CSV 입력의 두 번째 필드 값이 문자 배열로 분할되고 ;
첫 번째 필드의 값이 제공하는 요소가 추출됩니다. 과도한 공백 문자는 인쇄하기 전에 값에서 제거됩니다.