我想对文件 B 中的每个短语进行 grep 文件 A,其中短语是长度为 X 的单词字符串。理想情况下,它将是一个近似的 grep,如 agrep。有没有办法使用命令行工具来做到这一点?
答案1
使用zsh
,您可以尝试以下操作:
x=3
B_words=($(<B))
A_words=($(<A))
A="$A_words"
setopt extendedglob
for ((i = 1; i<=$#B_words - x + 1; i++)) {
phrase=$B_words[i,i+x-1]
[[ " $A " = (#a2)*" $phrase "* ]] && printf '%s\n' $phrase
}
这应该给你文件 B 的 3 个单词的序列,这些单词也在文件 A 中找到(允许 2 个错误(#a2)
)。
例如,如果A
你的问题B
是上面的句子,我得到:
of 3 words
3 words of
in file A
或者,如果您想查看文件中匹配的内容A
:
for ((i = 1; i<=$#B_words - x + 1; i++)) {
phrase=$B_words[i,i+x-1]
[[ " $A " = (#a2)(#b)*" "($phrase)" "* ]] &&
printf '%s\n' "$phrase ($match[1])"
}
这使:
of 3 words (of words)
3 words of (words of)
in file A (in file B,)
字这里定义为非 IFS 字符序列,默认值 $IFS 是除空格、制表符、换行符和 nul 之外的任何字符。
答案2
只要您关心整行,就可以使用 diff:
diff file1 file2 --old-line-format='' --new-line-format='' --unchanged-line-format='%L'
仅指old-line-format
第一个文件中的行,格式为空白以将其省略。
仅指new-line-format
第二个文件中的行,格式为空白以将其省略。
引用unchanged-line-format
两个文件中的行,格式'%L'
是打印出该行,包括换行符。
您可以在此处查看有关 diff 输出格式的更多信息:http://www.gnu.org/software/diffutils/manual/html_node/Line-Formats.html
答案3
很简单,只需运行cat A | grep -f B
Patterna 或简单的 bash 脚本即可:
#!/bin/bash
IFS=' ' read -ra ADDR <<< $(cat "$1")
read -ra ADDR2 <<< $(cat "$2")
for i in "${ADDR[@]}"; do
for n in "${ADDR2[@]}"; do
if [[ "$i" -eq "$n" ]]; then
echo $n
fi
done
done
并使用文件作为参数运行它./scritp.sh A B