
同じ文字列の値を別の行に追加するスクリプトを作成する必要があります。
たとえば、ファイルに次のものが含まれているとします。
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
入力を1行ずつ読みます。-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
ソートされた出力が必要な場合は、パイプで接続してください。