使用grep -v

时间:2016-08-01 18:47:59

标签: linux unix grep

我有一个制表符分隔文件,第1列是ID,第2列是信息。我有第二个文件,其中包含需要从第一个文件中删除的ID列表。当我使用grep时,我得到第一个文件的副本没有任何更改,或者我使用-v和-F -f“file2.txt”flags / arguments获得一个空白文件。 我的问题是:如何使用file2.txt将其中的ID与file1进行比较,以消除从file1到输出到file3的那些行。

awk 'BEGIN{RS=">"}NR>1{sub("\n","\t"); gsub("\n",""); print RS$0}' $1 > fasta.tab 
grep -F -f $2 fasta.tab -v >rmOutput.tab
tr '\t' \n' <rmOutput.tab >rmOutput.fas
echo Runtime Complete

第1行:从输入1创建制表符分隔文件 第2行:检查输入2是否匹配,并从制表符分隔文件中删除它们 第3行:重新创建输入1的格式 (为清楚起见)

编辑:样本I / O

输入1(制表符分隔 - 第1行之后):

ID1    Info1
ID2    Info2
ID3    Info3
ID4    Info4
ID5    Info5

输入2(要删除的ID):

ID2
ID4
ID5

所需输出(来自第2行)

ID1    Info1
ID3    Info3

2 个答案:

答案 0 :(得分:0)

awk 'NR==FNR{a[$0];next} !($1 in a)' input2 input1

答案 1 :(得分:0)

如果没有太多不同的ID要删除,请在一个简单的循环中运行removing lines inline with sed

# bash
cp file1.txt out_file.txt
for rem in `cat file2.txt`
do
  echo $rem
  sed -i "/$rem/d" out_file.txt
done

#fish
cp file1.txt out_file.txt
for rem in (cat file2.txt)
  echo $rem
  sed -i "/$rem/d" out_file.txt
end

PS

期待那些使用神秘的bash过程替换和笨拙的awk脚本的人的火焰,让我说: 事实上,如果您要删除许多不同的ID,您不应该使用这种非常简单和令人愉快的读取算法, 但是,根据The Holy Unix Philosophy Principles

  
      
  1. 花哨的算法比简单的算法更笨拙,而且实现起来要困难得多。使用简单的算法以及简单的数据结构。 (c)Rob Pike
  2.   

更重要的一个:

  

清晰度规则:清晰度胜于聪明。

     

因为维护非常重要而且非常昂贵,所以编写程序就好像他们所做的最重要的通信不是执行它们的计算机,而是编写将来会读取和维护源代码的人(包括你自己)

此外,我还会添加一个代码为fish的代码段。