3

Google スプレッドシートで作成した csv ファイルを解析しようとしています。テスト目的では非常に単純で、基本的には次のとおりです。

1,2
3,4
5,6

問題は、csv が改行文字で終わっていないためcat、BASH でファイルを取得すると、

MacBook-Pro:Desktop kkSlider$ cat test.csv 
1,2 
3,4 
5,6MacBook-Pro:Desktop kkSlider$ 

すべてのガイドが提案する while ループを使用して、BASH スクリプトを 1 行ずつ読みたいだけです。私のスクリプトは次のようになります。

while IFS=',' read -r last first
do
    echo "$last $first"
done < test.csv

出力は次のとおりです。

MacBook-Pro:Desktop kkSlider$ ./test.sh
1 2
3 4

最後の行を読み取ってエコーする方法についてのアイデアはありますか?

前もって感謝します。

4

3 に答える 3

7

次のように、ループへの入力を強制的に改行で終了させることができます。

#!/bin/bash
(cat test.csv ; echo) | while IFS=',' read -r last first
do
    echo "$last $first"
done

残念ながら、入力の最後に既に改行がある場合、出力の最後に空の行が表示される可能性があります。ちょっとした追加でそれを修正できます:

!/bin/bash
(cat test.csv ; echo) | while IFS=',' read -r last first
do
    if [[ $last != "" ]] ; then
        echo "$last $first"
    fi
done

別の方法は、値がによって変数に配置されているという事実に依存していますが、ステートメントreadのために出力されていません。while

#!/bin/bash
while IFS=',' read -r last first
do
    echo "$last $first"
done <test.csv
if [[ $last != "" ]] ; then
    echo "$last $first"
fi

whileこれは、ステートメントへの入力を変更するために別のサブシェルを作成しなくても機能します。


もちろん、ここでは、カンマではなくスペースを使用して値を出力するループ内でさらに多くのことを行いたいと想定しています。やりたいことがそれだけなら、次のbashような読み取りループよりも適した他のツールがあります。

tr "," " " <test.csv
于 2012-08-06T02:57:25.800 に答える
2
cat file |sed -e '${/^$/!s/$/\n/;}'| while IFS=',' read -r last first; do echo "$last $first"; done
于 2012-08-06T04:54:53.160 に答える
1

if最後の(終了していない)行を残りの行とは異なる方法で処理する必要がある場合は、余分なステートメントを含む @paxdiablo のバージョンが適しています。しかし、他のすべてと同じように処理する場合は、メイン ループで処理する方がクリーンです。

次のように、「終了していない最後の行があった場合」をメインループ条件にロールバックできます。

while IFS=',' read -r last first || [ -n "$last" ]
do
    echo "$last $first"
done < test.csv
于 2012-08-06T07:24:34.847 に答える