过滤掉shell中文件中匹配的记录

时间:2015-07-29 22:16:25

标签: bash shell unix awk

我有一个文件text.txt,其中包含以下记录:

xyz[4.3],default,
harry[1.0],default, 
molly[1.1],default, 
abc[1.0],rome, 
abc[1.1],rome, 
abc[1.2],rome, 
abc[1.4],rome,
abc[2.1],default, 
abc[2.2],default,  
ghi[1.0],moon, 
ghi[1.1-Test],moon, 
def[3.9],default,
def[4.2],default,

现在我将基于该变量输入记录名称作为变量,这些记录应该被过滤到新文件

例如: 对于上面的text.txt文件,如果我输入abc,罗马作为变量,outputfile.txt应该只有以下记录:

abc[1.0],rome, 
abc[1.1],rome, 
abc[1.2],rome, 
abc[1.4],rome,

我试过了:

final_order=$(awk -F/ -v RS=',|\n' \
  'FNR==NR{a[$1] = (a[$1])? a[$1] "," $0 : $0 ; next}
  {s = (s)? s "," a[$1] : a[$1]}
  END{print s}' ./temp/test.txt ./temp/variable)

3 个答案:

答案 0 :(得分:1)

在bash中使用参数扩展为grep:

创建正则表达式
search=abc,rome
grep "^${search/,/\[[^]]*\],}" text.txt

扩展名取代了与\[[^]]*\],相匹配的逗号,而不是[]本身和逗号。

答案 1 :(得分:1)

使用awk你可以这样做:

awk -v s='abc,rome' 'BEGIN{sub(/,/, "[^,]*&", s)} $0 ~ s' test.txt
abc[1.0],rome,
abc[1.1],rome,
abc[1.2],rome,
abc[1.4],rome,

sub(/,/, "[^,]*&", s)会将搜索字词abc,rome转换为abc[^,]*,rome

答案 2 :(得分:1)

在这种情况下,我认为最简单的是:

  

awk'/,罗马/'文件
  ABC [1.0],罗马,
  ABC [1.1],罗马,
  ABC [1.2],罗马,
  ABC [1.4],罗马,