2013-03-20 2 views
1

속성 추가 :리눅스 쉘 스크립트는 변수에 열을 읽고 나서이 파일 TEST.TXT이처럼 보이는이

2092 Mary 
103 Tom 
1239 Mary 
204 Mark 
1294 Tom 
1092 Mary 

내가 쉘 스크립트를 작성하려고 그런 것

  1. 읽기 각 행을 두 열에 데이터를 변수 var1과 var2에 넣습니다.
  2. 각 행의 var2가 동일한 경우 var1을 해당 행에 추가하십시오.
  3. 파일을 텍스트 파일로 출력합니다.

결과는 var2 열의 고유 한 값이어야합니다. 여기에 내가 지금까지 가지고있는 것이있다 :

#!/bin/sh 
#!/usr/bin/sh 
cat test.txt| while read line; 
do 
$var1=$(echo $line| awk -F\; '{print $1}') 
$var2=$(echo $line| awk -F\; '{print $2}') 

어떻게 각 라인의 변수를 참조하고 비교할 수 있습니까?
예상 출력은 다음과 같습니다 다음,

awk '{sum[$2] += $1} END {for (i in sum) printf "%4d %s\n", sum[i], i; }' 

는 (3.X되지 않음) bash 4.x를 함께하고 싶어 :

4423 Mary 
1397 Tom 
204 Mark 
+0

무엇 사용에 대한'일종의 -s -nk 1 ' 고유 값을 얻으려면'-u'를 사용 하시겠습니까? – fedorqui

+0

예상되는 출력을 추가 할 수 있습니까? 감사합니다 – average

+0

아니'done'? '$ var1 ='이라고하면 아마도'var1 = ... '을 의미 할 것입니다. 마지막으로, 그런 복잡한 방식으로 라인을 분할 할 필요가 없습니다. '읽는 동안 num name; ...; done shellter

답변

2

가 쉽습니다 awk를 사용

declare -A sum 
while read number name 
do 
    ((sum[$name] += $number)) 
done 

for name in "${!sum[@]}" 
do 
    echo ${sum[$name]} $name 
done 

여기 구조는 본질적으로 awk 스크립트와 동형이지만 약간 표기가 덜 편리합니다. 연관 배열 sum에 인덱스로 이름을 사용하여 표준 입력에서 읽습니다. ${!sum[@]} 표기법은 설명서의 Shell Parameter Expansion 섹션에 설명되어 있으며 Arrays 섹션에서도 암시되지 않습니다. 정보는 당신이 어디에 있는지 알면 거기에 있습니다. 이 (인수를 처리하지 않기 때문에

cat "[email protected]" | 
{ 
declare -A sum 
while read number name 
do 
    ((sum[$name] += $number)) 
done 

for name in "${!sum[@]}" 
do 
    echo ${sum[$name]} $name 
done 
} 

UUOC되지 않습니다 : 당신이합니다 (awk 스크립트 것 같은) 입력 파일의 임의의 수를 처리하려면

그런 다음 데이터를 수집하는 cat를 사용할 필요가 표준 입력 읽기), 하나의 인수 또는 여러 인수. 모든 스크립트에 대한

, 당신은 번호 나 이름의 순서로 출력을 정렬 할 경우, 스크립트의 출력에 적절한 sort을 적용

script file1 file2 file3 | sort -k 1,1n  # By sum increasing order 
script file1 file2 file3 | sort -k 1,1nr # By sum decreasing order 
script file1 file2 file3 | sort -k 2,2  # By name increasing order 
script file1 file2 file3 | sort -k 2,2r  # By name decreasing order 
+0

'bash' 4.2와'lastpipe' 옵션은'while' 루프 다음에'sum'이 보이도록해야합니다. 'for f;의 외부 루프. 할 동안 .... done < "$ f"; done'은 효과가있다. – chepner

+0

또는 '읽은 번호 이름; ...; done <<(cat "$ @")', 이전의 주석과는 달리 인자가 0으로 작동해야합니다. – chepner

+0

@chepner : Oh -drat!간단한 것조차도 '향상'을 테스트하지 않는 것이 항상 위험합니다. 고마워 - 나는'{...} '을 사용하여 스크립트의 조작 부분을'cat'출력의 리다이렉션을위한 단일 유닛으로 그룹화하는 방식으로 그것을 고치겠다. –