我正试图找到一个shell命令,以从文件中删除2个文件之间(两个逗号之间)的公共行。
所以我知道此命令可以找到文件之间的公共行:
file1=/opt/IBM/custom/NAC_Dslam/junk/PortParameter_E7_Single_cust_stats.csv
file2=/opt/IBM/custom/NAC_Dslam/junk/PortParameter_E7_Bonded_cust_stats.csv
comm -12 <(cut -d ',' -f2 ${file1} | sort) <(cut -d ',' -f2 ${file2} | sort)
我正在尝试将其与grep
命令一起使用以删除公用行。
例如, PortParameter_E7_Single_cust_stats.csv :
ABC: 1-1-1-21,12345678,13942
ABR: 1-1-1-22,23456789,3069
ABD: 1-1-1-33,34567890,796
ABE: 1-1-1-47,45678901,3187
PortParameter_E7_Bonded_cust_stats.csv :
ABC: 1-1-1-21,12345678,13942 //same
ABR: 1-1-1-22,23456789,3069 //same
ABD: 1-1-1-33,34567890,796 //same
ABE: 1-1-1-47,45678901,3187 //same
ACC: 1-1-1-21,12345679,13942
ACR: 1-1-1-22,23456780,3069
ACD: 1-1-1-33,34567899,796
ACE: 1-1-1-47,45678909,3187
所以我想删除 Bonded 文件中的前4个。
我知道我可以做到:
comm -12 <(cut -d ',' -f2 ${file1} | sort) \
<(cut -d ',' -f2 ${file2} | sort) > deleteme2.out
因此 deleteme2.out 应该显示:
12345678
23456789
34567890
45678901
然后我可以执行以下操作:
grep -vwF -f deleteme2.out ${file2} > realAllBondedFixed.test
grep -vwF -f deleteme2.out ${file1} > realAllSingleFixed.test
然后它显示0长度:
comm -12 <(cut -d ',' -f2 realAllBondedFixed.test | sort) \
<(cut -d ',' -f2 realAllSingleFixed.test | sort) > commonShouldBeEmpty.test
所以可行。我想将所有内容放在一个这样的命令中:
grep -vwF < comm -12 <(cut -d ',' -f2 ${file1} | sort) \
<(cut -d ',' -f2 ${file2} | sort) > realAllBondedFixed.test2
但出现错误:
-bash: comm: No such file or directory
我不确定是否遗漏格式问题或其他问题。我尝试在<
之后的-vwF
处加上括号,但这没有帮助。
我从grep to remove list of in a file获得了grep
命令,而comm
部分来自我公司的某人。
如果有人有任何帮助,我将不胜感激。
**根据要求进行澄清:
最终 PortParameter_E7_Single_cust_stats.csv :
(it would be empty, if every line has the common part between the commas)
最终 PortParameter_E7_Bonded_cust_stats.csv :
ACC: 1-1-1-21,12345679,13942
ACR: 1-1-1-22,23456780,3069
ACD: 1-1-1-33,34567899,796
ACE: 1-1-1-47,45678909,3187
答案 0 :(得分:1)
尝试将comm
管道到grep
:
file1=/opt/IBM/custom/NAC_Dslam/junk/PortParameter_E7_Single_cust_stats.csv
file2=/opt/IBM/custom/NAC_Dslam/junk/PortParameter_E7_Bonded_cust_stats.csv
comm -12 <(cut -d ',' -f2 ${file1} | sort) <(cut -d ',' -f2 ${file2} | sort) |
grep -vwF > realAllBondedFixed.test2
注意: OP 代码中的错误是使用<
将命令输出发送到grep
。 grep
需要来自文件或 stdin 的输入。当外壳看到:
grep -vwF < comm ...
它不运行comm
实用程序,而是查找名为 comm 的数据文件发送到grep
-没有此类文件,因此它显示错误bash: comm: No such file or directory
。
答案 1 :(得分:1)
是否仅需使用grep?如果不需要grep,这是另一种解决方案。
cat PortParameter_E7_Single_cust_stats.csv PortParameter_E7_Bonded_cust_stats.csv |
sort | uniq -d | cut -d ',' -f2 > output.txt
Output.txt:
12345678
34567890
45678901
23456789