我希望在与文件1比较时找到文件2中的匹配行。
file2包含多个列,第一列包含可与file1匹配的信息。
我尝试了以下命令并且没有给出任何匹配的结果(file1中的内容肯定在file2中)。我之前使用过这些命令来比较不同的文件并且它们有效。
b
当我试图grep任何不匹配的东西时,我得到了结果
grep -f file1 file2
grep -Fwf file1 file2
file1包含基因列表(754个基因),每个基因一行
grep -vf file1 file2
我觉得问题出在我的file1上。当我尝试在我的file1中手动键入几个项目来测试,并使用file2执行grep时,我从file2获得匹配的行。
当我将file1(最初在excel中)的内容复制到制作.txt文件的记事本中时,我没有得到任何匹配的结果。
我看不到我的file1有任何问题。有什么建议吗?
答案 0 :(得分:1)
我们假设这是file2:
$ cat file2
a b ATM
c d e
f ATR g
我们可以通过以下方式从file1获取与file2中任何列匹配的行:
$ grep -wFf <(sed 's/[[:space:]]/\n/g' file2) file1
ATM
ATR
这是有效的,因为它将file2转换为grep
理解的形式:
$ sed 's/[[:space:]]/\n/g' file2
a
b
ATM
c
d
e
f
ATR
g
$ awk 'FNR==NR{for (i=1;i<=NF;i++) seen[$i]; next} $0 in seen' file2 file1
ATM
ATR
这里,awk会跟踪它在file2中看到的每一列,然后只打印file1中与这些列之一匹配的那些行
答案 1 :(得分:1)
你说,
我将file1(最初在excel中)的内容复制到制作.txt文件的记事本中
txt文件可能包含回滚grep的回车/换行对。正如我在评论中建议的那样,试试这个:
tr -d '\015' < file1 > file1a
grep -Fwf file1a file2
tr
调用将删除所有回车符,为您提供正确的Unix / Linux文本文件,只包含换行符(\n
)作为行终止符。
你说:
我无法查看文件1的任何问题。
以下是如何查看额外的回车问题:
cat -v test1
每行末尾的那些小^M
标记是cat -v
显示回车控制代码的方式。
附录:
回车(CR)为十进制13,十六进制0x0d,八进制015,\r
在C.
换行(LF)为十进制10,十六进制0x0a,八进制012,\n
在C.
因为它是一个老式实用程序,tr
接受控制字符的八进制(基数8)表示法。
(我认为在某些版本中tr -d '\r'
会起作用,但我不确定,无论如何我不确定你的版本是什么。tr -d '\015'
应该是通用的。)
答案 2 :(得分:0)
尝试使用命令
comm
它是diff
的反转版本答案 3 :(得分:0)
简单的shell脚本,为file1.txt
中的每个输入执行grep#!/bin/bash
while read content; do
grep -q "$content" file2.txt
if [ $? -eq "0" ]; then
echo "$content" was found in file2 >> results.txt
fi
done < file1.txt