user2300940
user2300940

Reputation: 2385

grep file matching specific column

I want to keep only the lines in results.txt that matched the IDs in uniq.txt based on matches in column 3 of results.txt. Usually I would use grep -f uniq.txt results.txt, but this does not specify column 3.

uniq.txt

9606
234831
131
31313

results.txt

readID  seqID   taxID   score   2ndBestScore    hitLength       queryLength     numMatches
A00260:70:HJM2YDSXX:4:1111:15519:16720  NC_000011.10    9606    169     0       28      151     1
A00260:70:HJM2YDSXX:3:1536:9805:14841   NW_021160017.1  9606    81      0       24      151     1
A00260:70:HJM2YDSXX:3:1366:27181:24330  NC_014803.1     234831  121     121     26      151     3
A00260:70:HJM2YDSXX:3:1366:27181:24330  NC_014973.1     443143  121     121     26      151     3

Upvotes: 3

Views: 1014

Answers (2)

BarathVutukuri
BarathVutukuri

Reputation: 1303

You can use grep in combination with sed to manipulate the input patterns and achieve what you're looking for

grep -Ef <(sed -e 's/^/^(\\S+\\s+){2}/;s/$/\\s*/' uniq.txt) result.txt

If you want to match nth column, replace 2 in above command with n-1

outputs

A00260:70:HJM2YDSXX:4:1111:15519:16720  NC_000011.10    9606    169     0       28      151     1
A00260:70:HJM2YDSXX:3:1536:9805:14841   NW_021160017.1  9606    81      0       24      151     1
A00260:70:HJM2YDSXX:3:1366:27181:24330  NC_014803.1     234831  121     121     26      151     3

Upvotes: 2

RavinderSingh13
RavinderSingh13

Reputation: 133428

With your shown samples, please try following code.

awk 'FNR==NR{arr[$0];next} ($3 in arr)' uniq.txt results.txt

Explanation:

awk '                     ##Starting awk program from here.
FNR==NR{                  ##Checking condition which will be TRUE when uniq.txt is being read.
  arr[$0]                 ##Creating arrar with index of current line.
  next                    ##next will skip all further statements from here.
}
($3 in arr)               ##If 3rd field is present in arr then print line from results.txt here.
' uniq.txt results.txt    ##Mentioning Input_file names here.

2nd solution: In case your field number is not set in results.txt and you want to search values in whole line then try following.

awk 'FNR==NR{arr[$0];next} {for(key in arr){if(index($0,key)){print;next}}}' uniq.txt results.txt

Upvotes: 4

Related Questions