2016-07-29 2 views
-1

유닉스에서 입력 txt 파일을 정렬하는 방법을 살펴 보았지만 몇 가지 조언을 듣고 싶습니다.AWK에서 배열로 데이터

Product,color,stock 
apple,red,400 
apple,green,400 
apple,yellow,400 
grape,purple,500 
banana,yellow,120 

이것은 내 입력 파일이라고 말하면됩니다. 그것은 단지 텍스트 파일이지만 정보를 약간 통합하고자합니다.

내가 먼저 ... 나는 그것을 밖으로 인쇄하는 경우

awk -F '[,]' 'NR >= 1 {b[$1];} 

이 다음 날 떠날 것 ...과 같이 내 제품을 함께 그룹으로 AWK

apple 
grape 
banana 

하지만 경우에 사용 그 행에 열거 된 제품의 모든 색상과 같은 다른 정보를 포함하고 싶었 기 때문에 문제가 발생했습니다. 그 'b'인덱스 데이터를 다른 배열로 옮기고 싶다면 어떻게해야합니까? (awk 코드 외부에서 'b'에 액세스 할 수 없기 때문에) 어떻게해야합니까? 다음은 작동하지만 운은 없다고 생각했습니다.

awk -F '[,]' 'NR >= 1 {b[$1];}END{for (i in b) productArray+=(b[i])}' 
+2

[편집] 귀하의 질문에 그 샘플 입력 주어진 예상 출력을 포함 할 수 있습니다. wrt'awk 코드 외부에서 'b'에 액세스 할 수없는 것 같습니다. 물론 C 나 다른 변수에 사용 된 변수의 값에 액세스 할 수 있었던 적이 있습니까? 그 프로그램 밖에있는 프로그램? awk는 쉘이 아니며, C 프로그램처럼 셸에서 호출하는 도구입니다. –

답변

0

awk에는 실제로 이와 같은 중첩 목록이 없습니다. 당신이 데이터를 다른 배열 (배열 j)에 가고 싶은 경우에, 당신은이 작업을 수행 할 수 있습니다 cat test.txt |awk -F '[,]' 'NR > 1 { b[$1]=$2} END {for (x in b) { j[x]; print x}}'

두 번째 열에하려면

열 1에, 당신은 수있는 기반 독특한 라인에 붕괴 같은 것을 할 :

$ cat test.txt |awk -F ',' 'NR > 1 { if ($1 in b) { b[$1] = b[$1] FS $2} else { b[$1]=$2}} END {for (x in b) { print x,": " b[x] }}' apple : red,green,yellow banana : yellow grape : purple

+0

두 번째 코드는 훌륭하게 작동합니다! 그것이 어떻게 작동하는지 조금 확실하지 않습니다. 나는 b 제품에 이미 존재하는지 확인하기 위해 '제품'을 점검하는 방법을 본다. 그러나 그 후에 세부 사항을 확신 할 수 없다. 특히 초기 제품에 대해 b [$ 1] = $ 2]가있는 곳; 내가 가지고있는 것 (b [$ 1])이 적절하지 않습니까? – user3756215

+1

'b [$ 1] = $ 2 '는 두 번째 필드 ($ 2)의 문자열을'b [$ 1]'의 값으로 설정하는 것을 의미합니다. '제품 사과가 적색, 초록색'인 다음 제품의 '제품 사과가 빨간색'입니다. –

+0

Google UUOC과'if ($ 1 in b) {b [$ 1] = b [$ 1] FS $ 2} else {b [$ 1 ] = $ 2}'b [$ 1] = (b? b [$ 1] FS : "") $ 2'에서보다 일반적으로/관용적으로 쓰여진다. 또한'-v OFS = ':' '를 추가하면 끝에있는 print는'print x, b [x]'가됩니다. –