我有一个文本文件,每一行都有一个单词,我想做二元组并计算每个二元组的重复次数(统计数据)。
我的做法:
cat TEXTEN1.txt | tr '*\n' '*? *\n'
我想做两列,但这个解决方案失败了。
答案1
paste -d' ' - - < TEXTEN1.txt
要获取生成的二元组的计数:
paste -d' ' - - < TEXTEN1.txt | sort | uniq -c
然而,这种方法将排除一半的二元组。例如,如果您的输入文件是:
alpha
beta
gamma
alpha
beta
gamma
二元组将包括第 1-2 行、第 3-4 行和第 5-6 行,但不包括第 2-3 行和第 3-4 行。
您可以想象解决此问题的一种方法是创建输入文件的副本并在顶部添加一个非单词(例如“#”),然后过滤包含非单词的结果:
cat <(paste -d' ' - - < TEXTEN1.txt; paste -d' ' - - < TEXTEN2.txt) | sort | uniq -c | grep -v #
答案2
在gnu
系统上您可以运行:
paste <(head -n -1 infile) <(tail -n +2 infile) | sort | uniq -c
便携:
sed -e '1!{$!p' -e '}' infile | paste -d' ' - - | sort | uniq -c
或者
awk 'NR>1{i=t" "$0; z[i]++};{t=$0}END{for (i in z){print z[i], i}}' infile
答案3
如果你想要将每两个连续行上的单词组合成一个二元组,你可以这样做:
cat TEXTEN1.txt|sed 'N; s/\n/ /'|sort|uniq -c
这将组合连续的线对,如 1-2、3-4、5-6 等
如果你想要的是组合每+1行(即1-2、2-3、3-4 ...),你可以这样做
cat TEXTEN1.txt|sed -n ':a N;s/\n/ /p;s/\w* //;ta'|sort|uniq -c
或使用(更优雅一些)sed + paste
组合通过@don_crissti