以下を含むCSVファイルがあります。
a,b,c
d,e,f
g,h,i
a.txt
これで、このcsvの各レコードに対して3つの別々のファイル、d.txt
(最初のフィールド名にちなんで命名)を作成したいと思います。g.txt
各ファイルにはコマンドラインが含まれています。
a.txt
以下を含める必要があります。cat b|grep c
d.txt
以下を含める必要があります。cat e|grep f
g.txt
以下を含める必要があります。cat h|grep i
繰り返すことはできますが、ファイルに追加することはできません。
答え1
awk
その言語でコーディングすると仮定すると、sh
引用フィールド、カンマ、または改行文字を含まない単純なcsvがあります。
LC_ALL=C awk -F, -v q="'" '
function shquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
{
file = $1".txt"
print "grep -e "shquote($3)" < "shquote($2) > file
close(file)
}' < file.csv
代わりに、以下を実行してcat b | grep c
くださいgrep -e 'c' < 'b'
。
- 接続することは意味がありません。一つ文書。ここでは、
grep
stdinをファイルに直接設定して出力をパイプする代わりにリダイレクトできますcat
。 - シェル構文の特殊文字の問題を回避するには、文字列を引用します。
- で始まる正規表現の問題を避ける
grep -e regexp
のではなく使用してください。grep regexp
-
答え2
awk -F "," '{print "touch "$1".txt"";""echo cat "$2"|grep "$3"> "$1".txt"}' CSVfilename| sed 's/cat/"&/g'| sed 's/>/"&/g'|sh
テストを経てうまく機能しました