2

処理しようとしている CSV がありますが、一部のフィールドにコンマ、改行、スペースが含まれており、考えてみると、そこにもアポストロフィが含まれている可能性があります。

コンマと改行については、出力段階でそれらを他の文字列に変換し、最後に変換し直しました (はい、面倒ですが、これを実行する必要があるのは 1 回だけです)。スペースもありますが、問題を基本的な部分に分解して、回避できるかどうかを確認しました

ここにinput.csvがあります

"john","beatles.com","arse","fool@wonka.com","1","1","on holiday"
"paul","beatles.com","bung","","0","1","also on holiday"

(私は引用符の有無にかかわらず試しました)

ここにスクリプトがあります

INPUT="input.csv"

for i in `cat ${INPUT}`

do
#USERNAME=`echo $i | awk -v  FS=',' '{print $1}'`
USERNAME=`echo $i | awk 'BEGIN{FS="[|,:]"} ; {print $1}'`
echo "username: $USERNAME"

done

ジョンとポールを入力するだけでいいのですが、代わりに

username: "john"
username: holiday"
username: "paul"
username: on
username: holiday"

スペースを認識し、それらを新しい行として解釈するためです。

それを止めさせることはできますか?

4

4 に答える 4

3

ではなく、単語分割を引き起こしてawkいるシェル (のデフォルト値) です。IFS

次のように言って修正できます。

while read -r i; do
  USERNAME=$(echo "$i" | awk 'BEGIN{FS="[|,:]"} ; {print $1}');
  echo "username: $USERNAME";
done < $INPUT

シェルが入力をどのように読み取っているかを確認するには、次を追加します。

echo "This is a line: ${i}"

ループの中。

于 2013-11-12T19:38:11.140 に答える
1

awk では任意の正規表現フィールド セパレータを使用できます。たとえば、オプションのコンマの後に二重引用符を使用します。

awk -F ',?"' '{print $2, $4, $6, $8, $10, $12, "<" $14 ">"}' f1
john beatles.com arse fool@wonka.com 1 1 <on holiday>
paul beatles.com bung  0 1 <also on holiday>

最後のフィールド$14n< and >を囲んで、単一の awk 変数で取得する方法を示します。

于 2013-11-12T19:32:56.400 に答える
0

注意すべき点がいくつかあります。catまたはforループを使用する必要はありません。全体像を見逃さない限り...

ファイルに対して awk を呼び出すとどうなりますか?

awk -F"," '{print $1}' input.csv

私は以下を取得します:

$ awk -F"," '{print $1}' input.csv
"john"
"paul"
$
于 2013-11-12T19:36:55.327 に答える
0

問題のない解決策:

cut -d, -f1 input.csv | while read -r USERNAME ; do echo "username: ${USERNAME}" ; done

上記は、引用符を保持することを前提としています。そうでなければ...

cut -d, -f1 input.csv | sed 's,^",,;s,"$,,' | while read -r USERNAME ; do echo "username: ${USERNAME}" ; done

上記の両方とも、フィールドの内容にコンマがないことを前提としています。そうでない場合は、お気に入りのスクリプト言語で「適切な」CSV パーサーを使用してください。例...

ruby -rcsv -ne 'puts CSV.parse_line($_)[0]' input.csv | while read -r USERNAME ; do echo "username: ${USERNAME}" ; done
于 2013-11-12T19:38:02.310 に答える