Rey*_*x_0 5 text-processing file-comparison
假设我有两个文件a.txt和b.txt. 我想找到所有a.txt出现在b.txt.
有没有具体的命令来做到这一点?
和bash,zsh以及 的一些实现ksh:
comm -12 <(tr -s '[:space:]' '[\n*]' < a.txt | sort -u) \
<(tr -s '[:space:]' '[\n*]' < b.txt | sort -u)
Run Code Online (Sandbox Code Playgroud)
在那里,word是一个非间距字符序列(请注意,对于 GNU tr,它不适用于多字节间距字符)。
comm查找两个已排序文件之间的公共行。如果没有选项,它会打印 3 列:仅在 file1 中的行、仅在 file2 中的行以及两者共有的行。你加-1,-2,-3从输出中删除相应的列。所以comm -12只留下第三列(公共行)。
tr -s '[:space:]' '[\n*]' TR ansliterate任何小号类的人物的层序space成换行,把每个字占一行。
sort -u从tr的输出中排序并删除重复项。
进程替换<(...)将tr|sort命令的输出通过管道传输到comm.
与zsh:
w1=($(<a.txt)) w2=($(<b.txt))
print -rl -- ${(u)${w1:*w2}}
Run Code Online (Sandbox Code Playgroud)
在那里,word是除空格、制表符、空值和换行符之外的字符序列(默认值为$IFS)。
$(<a.txt)是$(cat a.txt)where 自己zsh读取文件内容而不调用的优化版本cat,因为它没有被引用,所以它会进行分词(但不会与其他外壳相反)。
所以,w1和w2是包含在所有的话阵列a.txt和b.txt。
${w1:*w2}是一个 zsh 运算符,它给出两个数组(两个数组共有的元素)的交集。(u)是保留唯一元素(删除重复项)的参数扩展标志。
print -rl 每行打印一个参数。