他の列が入力値と等しい場合、1列のBashスクリプトの合計

他の列が入力値と等しい場合、1列のBashスクリプトの合計

ヘッダー付きのCSVファイルがあります。列13の変数がCMDを介して渡す入力と等しい場合は、6番目の列の合計を計算するためにAWKを使用せずにbashスクリプトを作成したいと思います。

ファイルは次のとおりです。

IDENTIF,RIVER,LOCATION,ERECTED,PURPOSE,LENGTH,LANES,CLEAR-G,T-OR-D,MATERIAL,SPAN,REL-L,TYPE
E2,A,25,1819,HIGHWAY,1037,2,N,THROUGH,WOOD,SHORT,S,WOOD
E7,A,27,1840,HIGHWAY,990,2,N,THROUGH,WOOD,MEDIUM,S,WOOD
E16,A,25,1859,HIGHWAY,1030,2,N,THROUGH,IRON,MEDIUM,S-F,SUSPEN

たとえば、script.sh WOODを実行すると、6列のWOODと同じ13列の値の合計が出力されます。

AWKを使った多くのソリューションを見てすぐに解決しました。私はあなたがそれなしで同じことをすることができることを願っています。

私が試したコード:

#!/bin/bash

skip_line = 0
total_length = 0
while IFS=, read -r -a fields 
do
if [ $skip_line eq 0 ]
then
  skip_line = $(($skip_line + 1))
  continue
fi

if [ ${fields[12]} == $1 ]
then
    total_length = $(($total_length + ${fields[5]}))
fi
done < file.csv

echo "$total_length"

答え1

SMOP。

まずgrep、行選択を使用し、cutフィールド抽出を使用して値を合計します。

未テスト

#!/bin/bash
pat="$1"
export total=0
grep ",$pat," file.txt |\
  cut -d, -f6 |\
  while read num ; do
    total=$total + $num
  done
echo "$total"

答え2

この作業を検討する前に、次を参照してください。シェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?

=それにもかかわらず、あなたの試みは非常に近いです(1つの明らかな問題は課題の周りのスペースですtotal_length)。

#!/bin/bash

sum=0
while IFS=, read -a fields; do
  if [[ ${fields[12]} = "$1" ]]; then
    (( sum += fields[5] ))
  fi
done < file.csv

printf 'sum: %d\n' "$sum"

必要に応じて、if..then..fi短絡ロジックを使用する時間を短縮できます。

[[ ${fields[12]} = "$1" ]] && (( sum += fields[5] ))

${fields[12]} = "$1"テストに失敗するため、ヘッダー行を明示的にスキップする必要はありません。

関連情報