我有两个文件。
第一个(file1
)是这样的:
(在'text'line'之前总是有一个标题)
>random header name1
wonderfulstringwhatsoevergoeson
>random header 2
someotherline
...
另一个文件(file2
)是file1
的修改文件,如:
(标题已被删除,行被洗牌,添加了新标题)
>name
someotherline
wonderfulstringwhatsoevergoeson
file1
的每一行(没有标题)出现在file2
中。
file2
中的行顺序与file1
不同。
这两个文件都应保持原样。
file2
输出应该是相似的:
(file2
的标题可以忽略)
>random header 2
>random header name1
有人有线索,怎么办?
祝你好运
答案 0 :(得分:3)
鉴于文件应保持不变的说明,只需使用:
sort file1 file2 file2 | uniq -u
你已经完成了。
或者,如果文件很大,那么(file1 + file2 + file2)的排序是一个太大的负担,你可以使用它:
comm -23 <( sort file1 ) <( sort file2 )
将只对每个文件进行排序(磁盘上的文件保持原样,不会被修改),然后打印存在于file1中但不存在于file2中的行。
示例:
=$ cat file1
some header
abc
cdf
efg
other header
=$ cat file2
file2 header
cdf
file2 header part2
efg
abc
=$ comm -23 <( sort file1 ) <( sort file2 )
other header
some header
答案 1 :(得分:2)
如果我理解正确,您希望从file1打印与file2的每个元素对应的相应标头。
#!/bin/bash
cat file2 |
while read line; do
grep -B 1 "$line" file1 | head -n1
done
grep -B 1
会在比赛前打印一行。我们可以按头砍掉第一行
这可能被称为黑客。 (但我还是初学者)。
file1:
&gt;随机标题名称1 wonderfulstringwhatsoevergoeson
&gt;随机标题2
someotherline
file2:
someotherline
wonderfulstringwhatsoevergoeson
输出:
&gt;随机标题2
&gt;随机标题名称1
同样理解这个解决方案正如depesz指出的那样缓慢。
答案 2 :(得分:2)
GNU代码sed:
$sed '/^[>]/N;s#\(.*\)\n\(.*\)#/\2/s/.*/\1/p#' file1|sed -nf - file2 >random header 2 >random header name1