posix bash、csvファイルを読み取り、特定の列を無視する方法は?

posix bash、csvファイルを読み取り、特定の列を無視する方法は?

POSIXシェル、いいえPythonそしてではないアッ(だから、「実際の」プログラミング言語を使うべきだと言ってはいけません)ループを繰り返す必要がありますデータセット文書。

https://datacadamia.com/lang/bash/read

私の初期の推測は次のとおりです。

while IFS=";" read -r rec_name rec_version rec_license rec_origin rec_modification rec_newlicense
do
    if [ "$name" = "$rec_name" ]; then
        # if [ "$version" = "$rec_version" ]; then
            if [ "$license" = "$rec_license" ]; then
                license="$rec_newlicense"
            fi
        # fi
    fi
done < <(tail -n +2 "${output_file%%.*}.csv")

しかし、最後の行は」POSIX「が声明に合っているので、私は次のことを試しました。

while IFS=";" read -r rec_name rec_version rec_license rec_origin rec_modification rec_newlicense
do
    if [ "$name" = "$rec_name" ]; then
        # if [ "$version" = "$rec_version" ]; then
            if [ "$license" = "$rec_license" ]; then
                license="$rec_newlicense"
            fi
        # fi
    fi
done < "${output_file%%.*}.csv"

どういうわけか成功しますが、ヘッダー行も処理されます。

もう一つの問題は現場です。レコードバージョン','レコードソース「そして」履歴を編集'は引用されていません。

どうすれば無視できますか?

私も試したので:

while IFS=";" read -r -a rec
do
    if [ "$name" = "${rec[0]}" ]; then
        # if [ "$version" = "${rec[1]}" ]; then
            if [ "$license" = "${rec[2]}" ]; then
                license="${rec[5]}"
            fi
        # fi
    fi
done < "${output_file%%.*}.csv"

しかし、私は次のような結果を得ます:

read: line 93: illegal option -a

それでは、これについてどう思いますか?

挨拶。

ベストアンサー1

<()最初の試みではPOSIXではないので、通常のパイプを使用してください。

tail -n +2 "${output_file%%.*}.csv" | 
  while IFS=";" read -r rec_name rec_version rec_license rec_origin rec_modification rec_newlicense
  do
    if [ "$name" = "$rec_name" ]; then
        if [ "$license" = "$rec_license" ]; then
            license="$rec_newlicense"
        fi
    fi
  done

しかし、これは少し複雑なようです。解析中のデータを表示していないのでわかりませんが、次のようにできると思います。

tail -n +2 "${output_file%%.*}.csv" | 
  while IFS=";" read -r rec_name rec_version rec_license rec_origin rec_modification rec_newlicense
  do
    if [ "$name" = "$rec_name" ] && [ "$license" = "$rec_license" ] 
    then
        license="$rec_newlicense"
    fi
  done

未使用の用語を無視する場合、その間の用語についてはそれを行うことはできません。最初のN個の項目を簡単に選択し、残りは無視できます。

while read -r var1 var2 rest; do ... done

これは最初の2つの変数を読み、残りの行をrest。または、シェルに渡す前に削除してください。

tail -n +2 "${output_file%%.*}.csv" | 
    cut -d';' -f1,3,6 | 
        while IFS=";" read -r rec_name rec_license  rec_newlicense
        do 
          if [ "$name" = "$rec_name" ] && [ "$license" = "$rec_license" ] 
          then
              license="$rec_newlicense"
          fi
        done

おすすめ記事