2017-01-09 81 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

相关问题