Linux Awk:一个文本文件中的词频,如何输出到myFile.txt?

Linux Awk:一个文本文件中的词频,如何输出到myFile.txt?,linux,shell,awk,frequency-analysis,word-frequency,Linux,Shell,Awk,Frequency Analysis,Word Frequency,给定一个以空格分隔的.txt文件,例如: But where is Esope the holly Bastard But where is 以及Awk功能: 我在控制台中获得以下输出: 1 Bastard 1 Esope 1 holly 1 the 2 But 2 is 2 where 如何进入打印到myFile.txt? 我实际上有30万行,近200万字。最好将结果输出到文件中 编辑:由@Sudo_O使用答案: $ awk '{a[$1]++}END{for(k in a)print a

给定一个以空格分隔的.txt文件,例如:

But where is Esope the holly Bastard
But where is
以及Awk功能:

我在控制台中获得以下输出:

1 Bastard
1 Esope
1 holly
1 the
2 But
2 is
2 where
如何进入打印到myFile.txt? 我实际上有30万行,近200万字。最好将结果输出到文件中

编辑:由@Sudo_O使用答案:

$ awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" myfile.txt | sort > myfileout.txt

只需将输出重定向到一个文件

cat /pathway/to/your/file.txt % tr ' ' '\n' | sort | uniq -c | \
awk '{print $2"@"$1}' > myFile.txt

只需将输出重定向到一个文件

cat /pathway/to/your/file.txt % tr ' ' '\n' | sort | uniq -c | \
awk '{print $2"@"$1}' > myFile.txt
只需使用:

提示 一个有用的命令是tee,它允许重定向到文件并仍然可以看到输出:

echo "test" | tee overwrite-file.txt
echo "test" | tee -a append-file.txt
排序和区域设置 我看到您正在使用亚洲脚本,您需要小心您的系统使用的区域设置,因为结果排序可能不是您所期望的:

*警告*环境指定的区域设置会影响排序顺序。设置LC_ALL=C以获取使用本机字节值的传统排序顺序

并查看以下各项的输出:

locale 
只需使用:

提示 一个有用的命令是tee,它允许重定向到文件并仍然可以看到输出:

echo "test" | tee overwrite-file.txt
echo "test" | tee -a append-file.txt
排序和区域设置 我看到您正在使用亚洲脚本,您需要小心您的系统使用的区域设置,因为结果排序可能不是您所期望的:

*警告*环境指定的区域设置会影响排序顺序。设置LC_ALL=C以获取使用本机字节值的传统排序顺序

并查看以下各项的输出:

locale 

您的管道效率不高,您应该在awk中完成全部工作:

如果要按排序的顺序输出:

awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" file | sort > myfile
管道给出的实际输出为:

$ tr ' ' '\n' < file | sort | uniq -c | awk '{print $2"@"$1}'
Bastard@1
But@2
Esope@1
holly@1
is@2
the@1
where@2
我们可以再次排序,并使用sed删除前导空格:


您的管道效率不高,您应该在awk中完成全部工作:

如果要按排序的顺序输出:

awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" file | sort > myfile
管道给出的实际输出为:

$ tr ' ' '\n' < file | sort | uniq -c | awk '{print $2"@"$1}'
Bastard@1
But@2
Esope@1
holly@1
is@2
the@1
where@2
我们可以再次排序,并使用sed删除前导空格:


为什么不能将控制台的输出通过管道传输到文件?你已经完成了所有的艰苦工作。我对Awk/控制台脚本完全陌生。我复制粘贴了这段代码,明白了,但这是我的第一个脚本。@Hugolpz这是一个非常低效的方法,看看我的答案。你应该让awk完成整个工作。为什么不能将控制台的输出通过管道传输到一个文件?你已经完成了所有的艰苦工作。我对Awk/控制台脚本完全陌生。我复制粘贴了这段代码,明白了,但这是我的第一个脚本。@Hugolpz这是一个非常低效的方法,看看我的答案。你应该把整个工作都交给awk.我的文件里没有你的密码,你能把它放回去吗?您可能还想用回答,因为您的最终awk代码也适用于它!>myfile将输出从stdout重定向到文件myfile,这意味着您在终端中看不到输出,而是将其写入磁盘,并且假设没有任何内容写入stderr,则什么也看不到。我不在前两个awk脚本之后使用重定向,因为我希望打印输出,以便您可以看到发生了什么。我希望这是清楚的。可以与@edouard_lopez技巧互补:使用允许重定向到文件并仍能看到输出的tee,我必须使用带-numeric sort标志的sort,以便字数按数值排序,而不是按字符串表示。如果“>myfile”取消了您的代码,您能把它放回去吗?您可能还想用回答,因为您的最终awk代码也适用于它!>myfile将输出从stdout重定向到文件myfile,这意味着您在终端中看不到输出,而是将其写入磁盘,并且假设没有任何内容写入stderr,则什么也看不到。我不在前两个awk脚本之后使用重定向,因为我希望打印输出,以便您可以看到发生了什么。我希望这是清楚的。可以与@edouard_lopez技巧互补:使用允许重定向到文件并仍能看到输出的tee,我必须使用带-numeric sort标志的sort,以便字数按数值排序,而不是按字符串表示。
$ awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" file | sort
1 Bastard
1 Esope
1 holly
1 the
2 But
2 is
2 where