2017-01-09 17 views
0

私は以下のテキストファイル/tmp/some.txtを持っているが、私は(すなわち行に基づく。列に基づいていない)形式以下とcsvファイルを作成したいシェルスクリプトの行に基づいてCSVファイルを作成するにはどうすればよいですか?

JOHN    YES  6   6   2345762 
SHAUN    NO  6   6   2345748 

値。私はwc -l /tmp/some.txt | awk '{print $1}'ここでのコードの下に

for i in `wc -l /tmp/some.txt | awk '{print $1}'` 
do 
awk 'NR==$i' /tmp/some.txt | awk '{print $1","$2","$3","$4","$5}' >> /tmp/some.csv 
done 

を試してみました

JOHN,YES,6,6,2345762 
SHAUN,NO,6,6,2345748 

は2(テキストファイル内すなわち2行)として値を取得します。 と各行awk 'NR==$i' /tmp/some.txt | awk '{print $1","$2","$3","$4","$5}'は、カンマで区切られたsome.csvファイルに5つのフィールドを出力します。

私は別々に各コマンドを実行すると動作します。しかし、私はシェルスクリプトとして私は空のsome.csvファイルを取得しています。

+2

をなぜあなたは1つだけコンマでスペースのすべてのブロックを置き換えるものではありませんか? – fedorqui

答えて

1

私はお勧め:

sed 's/[[:space:]]\+/,/g' /tmp/some.txt 
1

@Kart:あなたは、次の試してみてくださいでした。

awk '{$1=$1;} 1' OFS=, Input_file > output.csv 

私はこれがあなたを助けてくれることを願っています。

1

あなたはほとんどそれを持っています。 awkはすでに行単位でファイルを処理していますので、forループで反復処理する必要はありません。

だから、あなただけ実行する必要があります。一つ以上を代入し、sed

tr -s '[:blank:]' ',' <file.txt 

:スペース/タブ([:blank:])を翻字、その後(-sを)絞って、

awk '{print $1","$2","$3","$4","$5}' /tmp/some.txt >> /tmp/some.csv 
+1

はOFSをよりよく定義し、$ 1、$ 2、... – fedorqui

+0

を印刷します。 @Kartが書いたのと同じコマンドを使っただけです。 – charli

1

trでは、とスペース/タブ付き,

sed 's/[[:blank:]]\+/,/g' file.txt 
で3210

,gsub()機能を使用してスペース/タブ1つ以上の交換:

awk 'gsub("[[:blank:]]+", ",", $0)' file.txt 

% cat foo.txt 
JOHN    YES  6   6   2345762 
SHAUN    NO  6   6   2345748 


% tr -s '[:blank:]' ',' <foo.txt      
JOHN,YES,6,6,2345762 
SHAUN,NO,6,6,2345748 

% sed 's/[[:blank:]]\+/,/g' foo.txt     
JOHN,YES,6,6,2345762 
SHAUN,NO,6,6,2345748 

% awk 'gsub("[[:blank:]]+", ",", $0)' foo.txt 
JOHN,YES,6,6,2345762 
SHAUN,NO,6,6,2345748 
+0

ニース!私は、あなたが絞って、 'tr 'で一発で置き換えることができることに気づいていませんでした。 – fedorqui

関連する問題