试图找到shell命令从文件

时间:2018-08-01 20:04:28

标签: bash shell grep

我正试图找到一个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

2 个答案:

答案 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 代码中的错误是使用<将命令输出发送到grepgrep需要来自文件或 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