使用AWK将每个单词放在新行的文本文件中

时间:2016-03-29 17:27:28

标签: bash awk

我正在尝试使用AWK将文本文档中的每个单词放在新行上。我真的不知道如何使用AWK,但我发现一些在线命令可以解决我的问题。我尝试过以下命令:

$ awk '{ for (i = 1; i <= NF; i++) print $i }' input.txt > output.txt 

$ awk '{c=split($0, s); for(n=1; n<=c; ++n) print s[n] }' input.txt > output.txt

但是,这两个命令都具有相同的效果,即删除所有空格。

为清楚起见,我们假设input.txt包含文本:

The fox jumped over the dog

output.txt应包含:

The
fox
jumped
over
the
dog

但是output.txt包含:

Thefoxjumpedoverthedog

我在Windows 7上使用Cygwin来使用这些命令。命令中是否有我遗漏的东西?

3 个答案:

答案 0 :(得分:2)

另一种选择

echo "the fox jumped over the dog" | awk -v OFS="\n" '{$1=$1}1'

从文件awk ... inputfile

中读取 但是,我不确定它会解决你的情况。如果awk被破坏,您可以尝试tr

echo ... | tr ' ' '\n'

会做的。

答案 1 :(得分:2)

根据联机帮助页,awk中的print打印其参数:

  

由当前输出字段分隔符分隔,并由输出记录分隔符

终止

所以你的第一个命令没问题,但你需要确保输出记录分隔符是一个新行。默认输出记录分隔符是换行符,但请尝试确保:

awk -v ORS='\n' '{ for (i = 1; i <= NF; i++) print $i }' input.txt > output.txt

仅在Cygwin上,您可能会遇到Windows / DOS行结尾的问题。另请尝试ORS='\r\n'。或者,通过unix2dos管道输出。

答案 2 :(得分:0)

你可以在Perl中轻松地做到这一点:

$ echo "The fox jumped over the dog" | perl -ple 's/\h/\n/g'
The
fox
jumped
over
the
dog

同样适用于awk:

$ echo "The fox jumped over the dog" | awk '{gsub(/ /,"\n"); print}'
The
fox
jumped
over
the
dog