Ada*_*tan 64 bash file-io set-difference
我有两个文件A- nodes_to_delete和B- nodes_to_keep.每个文件都有许多带有数字ID的行.
我想要列出数字ID,nodes_to_delete但不在其中nodes_to_keep,例如alt文本http://mathworld.wolfram.com/images/equations/SetDifference/Inline1.gif.
在PostgreSQL数据库中执行它是非常慢的.使用Linux CLI工具在bash中做任何简洁的方法吗?
更新:这似乎是一个Pythonic工作,但文件真的非常大.我已经解决了使用一些类似的问题uniq,sort一些集理论技术和.这比数据库等价物快两到三个数量级.
msw*_*msw 101
该通讯命令做到这一点.
sli*_*nkp 40
几个月前有人告诉我如何做到这一点,然后我找不到它一段时间......虽然看着我偶然发现了你的问题.这里是 :
set_union () {
sort $1 $2 | uniq
}
set_difference () {
sort $1 $2 $2 | uniq -u
}
set_symmetric_difference() {
sort $1 $2 | uniq -u
}
Run Code Online (Sandbox Code Playgroud)
使用comm-它将逐行比较两个排序的文件。
此命令将返回deleteNodes独有的行,但不返回keepNodes中的行。
comm -1 -3 <(sort keepNodes) <(sort deleteNodes)
Run Code Online (Sandbox Code Playgroud)
让我们创建名为keepNodes和的文件deleteNodes,并将其用作comm命令的未排序输入。
$ cat > keepNodes <(echo bob; echo amber;)
$ cat > deleteNodes <(echo bob; echo ann;)
Run Code Online (Sandbox Code Playgroud)
默认情况下,运行不带参数的comm将使用以下布局打印3列:
lines_unique_to_FILE1
lines_unique_to_FILE2
lines_which_appear_in_both
Run Code Online (Sandbox Code Playgroud)
使用上面的示例文件,运行不带参数的comm。请注意三列。
$ comm <(sort keepNodes) <(sort deleteNodes)
amber
ann
bob
Run Code Online (Sandbox Code Playgroud)
用-N抑制第1、2或3列;请注意,隐藏列时,空格会缩小。
$ comm -1 <(sort keepNodes) <(sort deleteNodes)
ann
bob
$ comm -2 <(sort keepNodes) <(sort deleteNodes)
amber
bob
$ comm -3 <(sort keepNodes) <(sort deleteNodes)
amber
ann
$ comm -1 -3 <(sort keepNodes) <(sort deleteNodes)
ann
$ comm -2 -3 <(sort keepNodes) <(sort deleteNodes)
amber
$ comm -1 -2 <(sort keepNodes) <(sort deleteNodes)
bob
Run Code Online (Sandbox Code Playgroud)
如果执行comm时未先对文件进行排序,则它会优雅地失败,并显示一条消息,提示未排序文件。
comm: file 1 is not in sorted order
comm是专门为这种用例设计的,但它需要排序的输入。
awk可以说是一个更好的工具,因为它相当直接地找到集合差异,不需要sort,并且提供了额外的灵活性。
awk 'NR == FNR { a[$0]; next } !($0 in a)' nodes_to_keep nodes_to_delete
Run Code Online (Sandbox Code Playgroud)
例如,也许您只想找到表示非负数的行中的差异:
awk -v r='^[0-9]+$' 'NR == FNR && $0 ~ r {
a[$0]
next
} $0 ~ r && !($0 in a)' nodes_to_keep nodes_to_delete
Run Code Online (Sandbox Code Playgroud)