2017-01-09 97 views
0

我有一個文本文件/tmp/some.txt下面值如何根據shell腳本中的行創建CSV文件?

JOHN    YES  6   6   2345762 
SHAUN    NO  6   6   2345748 

我想創建以下格式的csv文件(即基於行。不是基於列)。

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

我想下面的代碼

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 

這裏wc -l /tmp/some.txt | awk '{print $1}'將獲得價值2(在文本文件中即2行)。 ,並且對於每一行awk 'NR==$i' /tmp/some.txt | awk '{print $1","$2","$3","$4","$5}'將打印5個字段到some.csv文件,文件以逗號分隔。

當我分別執行每個命令它將工作。但是當我把它作爲一個shell腳本時,我得到空some.csv文件。

+2

爲什麼你不只是更換的空間所有塊與一個逗號? – fedorqui

回答

1

我建議:

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

@Kart:可否請您嘗試以下。

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

我希望這可以幫助你。

1

你幾乎明白了。 awk已經逐行處理文件,因此您無需循環使用for循環。

所以,你只需要運行:

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

更好地定義OFS並且只需打印$ 1,$ 2,... – fedorqui

+0

這是真的,這是一個更好的答案。我剛剛使用了@Kart寫過的相同命令。 – charli

1

隨着tr,擠壓(-s),然後音譯空間/製表([:blank:]):

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

隨着sed,替換一個或多個空格/製表符,

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

隨着awk,使用gsub()功能,替換一個或多個空格/製表:

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

相關問題