같은 문자열의 값을 다른 줄에 추가하는 스크립트를 작성해야 합니다.
예를 들어, 파일에 다음이 포함되어 있는 경우:
abc,10
xyz,20,
abc,30,
ghd,40
xyz,10
스크립트는 파일에서 일치하는 문자열 abc
등을 확인 xyz
하고 해당 값을 추가하고 출력을 새 파일로 리디렉션해야 합니다.
출력은 다음과 같아야 합니다.
abc,40,
xyz,30,
ghd,40
이에 대한 스크립트를 작성할 수 있나요? 어떤 의견이라도 도움이 될 것입니다.
답변1
Perl에서는 쉽습니다. 해시를 사용하여 누계를 저장하세요.
perl -laF/,/ -ne '
$h{ $F[0] } += $F[1];
}{
print "$_,$h{$_}" for keys %h;
' input-file > output-file
-n
입력을 한 줄씩 읽습니다.-l
개행 문자 추가print
-a
각 입력 행을 @F 배열로 분할-F/,/
-a
쉼표로 구분하여 알려주세요 .}{
-n
입력이 끝날 때 실행될 코드와 루프를 분리하는 "Eskimo Greeting" 연산자입니다 .
답변2
어때요 bash
:
for i in $(cut -d ',' -f1 FILE | sort | uniq)
do
echo -n "$i", &&
echo -n $(grep "^$i," FILE | cut -d',' -f2 | paste -sd+ - | bc)
echo $(echo "$i" | grep -E -o ",$") || echo
done
아니면 놓치게 될 경우 ,
:
for i in $(cut -d ',' -f1 FILE | sort | uniq)
do
echo -n "$i", &&
echo -n $(grep "^$i," FILE | cut -d',' -f2 | paste -sd+ - | bc) &&
grep -E -o "$i,[0-9]+,$" FILE >/dev/null && echo ',' || echo
done
또는 토큰 순서를 저장하려면 다음을 수행하십시오.
for i in $(cut -d ',' -f1 FILE | awk '!seen[$0]++')
do
echo -n "$i", &&
echo -n $(grep "^$i," FILE | cut -d',' -f2 | paste -sd+ - | bc) &&
grep -E -o "$i,[0-9]+,$" FILE >/dev/null && echo ',' || echo
done
FILE
실제 파일 이름으로 바꾸십시오 .
답변3
awk -F, -v OFS=, '{
str[$1]+=$2;
next
}
END {
for (s in str) {
print s, str[s]
}
}' filename
각 문자열(필드 1)의 누적 합계를 포함하는 연관 배열(즉, 정수가 아닌 문자열로 키 지정)을 구성합니다.
모든 입력을 읽으면 배열의 각 요소를 인쇄합니다.
ghd,40
abc,40
xyz,30
sort
정렬된 출력을 원하면 파이프로 연결하십시오.