所以我试图使用的第一列通信输出awk.我读到Tab被用作comm的分隔符,所以我做了:
awk -F"\t" '{print $1}' comm-result.txt
Run Code Online (Sandbox Code Playgroud)
使用comm-result.txt包含输出:
comm -3 file1 file2
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.
这个推荐还将空格字符作为分隔符,当我的文件包含多个空格时,我得到奇怪的结果.
我怎么才能从第一列获得comm?
我有两个没有分拣的文件有一些共同点.
FILE1.TXT
Z
B
A
H
L
Run Code Online (Sandbox Code Playgroud)
FILE2.TXT
S
L
W
Q
A
Run Code Online (Sandbox Code Playgroud)
我用来删除公共行的方式如下:
sort -u file1.txt > file1_sorted.txt
sort -u file2.txt > file2_sorted.txt
comm -23 file1_sorted.txt file2_sorted.txt > file_final.txt
Run Code Online (Sandbox Code Playgroud)
输出:
B
H
Z
Run Code Online (Sandbox Code Playgroud)
问题是我想保留file1.txt的顺序,我的意思是:
期望的输出:
Z
B
H
Run Code Online (Sandbox Code Playgroud)
我试过的一个解决方案是循环读取file2.txt的所有行:
sed -i '/^${line_file2}$/d' file1.txt
Run Code Online (Sandbox Code Playgroud)
但如果文件很大,性能可能会很糟糕.
我需要找到大量文件(空分隔的项目data2,data3存在于...) data1.完全匹配是必需的.
一切都很好用,grep -f data1 data2 data3 ...直到所有项目data1也为空分隔.
仅使用换行符 - 好的:
$ cat data1
1234
abcd
efgh
5678
$ cat data2
1111
oooo
abcd
5678
$ grep -xFf data1 data2
abcd
5678
Run Code Online (Sandbox Code Playgroud)data2-包含null分隔的项目确定时-z:使用
$ printf '1111\0oooo\0abcd\0005678' > data2
$ grep -zxFf data1 data2 | xargs -0 printf '%s\n'
abcd
5678
Run Code Online (Sandbox Code Playgroud)现在,这两个data1和data2包含空分隔的项目- 失败.似乎该-z选项不适用于指定的文件-f:
$ printf '1234\0abcd\0efgh\0005678' > …Run Code Online (Sandbox Code Playgroud)鉴于这两个文件:
$ cat A.txt $ cat B.txt
3 11
5 1
1 12
2 3
4 2
Run Code Online (Sandbox Code Playgroud)
我想在B中找到A"BUT NOT"中的行号.什么是unix命令?
我试过这个,但似乎失败了:
comm -3 <(sort -n A.txt) <(sort -n B.txt) | sed 's/\t//g'
Run Code Online (Sandbox Code Playgroud) 我有文件file1,file2其中file2是 的子集file1。这意味着,如果我迭代file1,则有些行在 中file2,有些行不在 中,但没有行file2不在 中file1。一个文件中可能有多行内容相同。现在我想知道它们之间的区别,即所有行file1都不在file2.
diff(1) 不是答案,comm(1) 才是。
(无论出于何种原因)
但据我了解,comm首先需要对文件进行排序。问题:两个文件都是有序的(未排序!),并且需要保留此顺序。所以我真正想要的是迭代file1,并检查每一行,如果它也在file2. 如果没有,请将其写入file3. 如果相同内容出现多次,则应保留多次!
有没有办法用命令行来做到这一点?
我有2个文本文件,并希望文件A中的删除行包含文件B中的字符串
档案A:
joe ball 1335
john dyer 1365
dylan fisher 1795
ian gill 1913
eric kelly 1101
Run Code Online (Sandbox Code Playgroud)
文件B:
1795
1913
Run Code Online (Sandbox Code Playgroud)
我希望Bash代码获得如下结果:
joe ball 1335
john dyer 1365
eric kelly 1101
Run Code Online (Sandbox Code Playgroud)
我尝试这些代码,但答案没有成功
$ grep -vwF -f A B
$ awk -F'[ ,]' 'FNR==NR{a[$1];next} !($4 in a)'
Run Code Online (Sandbox Code Playgroud) 我有100个文本文件,每个文件包含单个列.文件如下:
file1.txt
10032
19873
18326
file2.txt
10032
19873
11254
file3.txt
15478
10032
11254
Run Code Online (Sandbox Code Playgroud)
等等.每个文件的大小不同.请告诉我如何找到所有这100个文件中常见的数字.
我有两个非常大的文件(文件 1 和文件 2),文件 1 有很多行和列,为了简单起见,我粘贴了第 1 列。我只想打印文件 1 特有的那些行。
文件一:
AT1G01010.1
AT1G01020_P1
AT1G01020_P2
AT1G01040.2
AT1G01040_P1
AT1G01046.1
AT1G01050_ID7
Run Code Online (Sandbox Code Playgroud)
文件2:
AT1G01010
AT1G01046
AT1G01050
Run Code Online (Sandbox Code Playgroud)
输出:
AT1G01020_P1
AT1G01020_P2
AT1G01040.2
AT1G01040_P1
Run Code Online (Sandbox Code Playgroud)
我在 Ubuntu 中尝试过comm命令,但它不起作用,因为它检查完整的模式。因此,当它尝试检查时,AT1G01010.1它AT1G01010不会显示任何常见内容。
# comm -12 /tmp/src /tmp/txt | wc -l
10338
# join /tmp/src /tmp/txt | wc -l
10355
Run Code Online (Sandbox Code Playgroud)
这两个文件都是单列字母数字字符串和sort-ed。他们不应该是一样的吗?
更新以下@Kevin-s 回答:
cat /tmp/txt | sed 's/^[:space:]*//' > /tmp/stxt
cat /tmp/src | sed 's/^[:space:]*//' > /tmp/ssrc
Run Code Online (Sandbox Code Playgroud)
结果:
#join /tmp/ssrc /tmp/stxt | wc -l
516
# comm -12 /tmp/ssrc /tmp/stxt | wc -l
513
Run Code Online (Sandbox Code Playgroud)
在手动检查diff-s 时...结果不同,因为sed.
我正在处理大文件,我只想提取一列的值包含在另一个文件的列的值中的行.
例如,在file1中,我有10,000行看起来像这样:
Chr13998356 T C
Chr1401532 A G
Chr14021851 A T
Run Code Online (Sandbox Code Playgroud)
我有file2(100,000+行),其中我只想要文件1的第1列中第1列中的值的行.因此,对于文件2,我有:
Chr1 401530 G G 60 0 60 11
Chr1 401531 A A 60 0 60 11
Chr1 401532 A G 30 170 60 11
Run Code Online (Sandbox Code Playgroud)
我想以第三个文件结束:
Chr1 401532 A G 30 170 60 11
Run Code Online (Sandbox Code Playgroud)
此文件可以包含几到10,000行.
在R中,我会使用类似的东西df3 <- df2[df2[,1] %in% df1[,2],],但文件太大了.
有简单的UNIX解决方案吗?像使用comm这样的东西,但只匹配第一列而不是整行,这将是完美的.或者grep的东西,但同时搜索10K模式.
有任何想法吗?
对于常规文件,我可以使用 comm命令来查找公共行。
例如我们有两个文件
$ cat f1
line1
line2
line3
line4
line5
$ cat f2
line1
line20
line30
line4
line5
Run Code Online (Sandbox Code Playgroud)
它比较像:
$ comm -12 f1 f2
line1
line4
line5
Run Code Online (Sandbox Code Playgroud)
如何找到匹配行的偏移量以及如何对两个二进制文件进行比较并打印匹配行偏移量?
我一直在使用诸如diff, cmp,comm过去1小时,摸不清头脑。
编辑 1:不是确切的解决方案,但发现 vbindiff 有帮助。
我有15个不同的文件,我想要一个新文件,其中只包含所有文件中的公共行.例如:
File1:
id1
id2
id3
file2:
id2
id3
id4
file3:
id10
id2
id3
file4
id100
id45
id3
id2
I need the output be like:
newfile:
id2
id3
Run Code Online (Sandbox Code Playgroud)
我知道这个命令适用于每对文件:
grep -w -f file1 file2>输出
但我需要一个命令来工作超过2个文件.
有什么建议吗?
comm ×12
bash ×5
grep ×4
awk ×3
linux ×3
shell ×3
diff ×2
sed ×2
unix ×2
binaryfiles ×1
cmp ×1
command-line ×1
difference ×1
join ×1
optimization ×1
perl ×1
sorting ×1
unique ×1