Print all lines in "file2" which have line number stored in "file1" $2 Print all lines in "file2" which have line number stored in "file1" $2 unix unix

Print all lines in "file2" which have line number stored in "file1" $2


Using awk you can do:

awk 'NR==FNR{line[$2]; next} FNR in line' file1 file2

We iterate the first file and store second column in a map called line (we could ignore the first line which is the header by doing NR>1 but since it doesn't contain numbers we don't need to). Once the first file is loaded in map, we iterate the second file and print out lines that are in our map. NR and FNR are awk variables that remembers the line numbers.


You can use awk to read the line numbers in a loop and sed to print out the specific lines:

while read a; do sed -n ${a}p f2.txt; done < <(awk 'NR>1{print$2}' f1.txt)

If you have a bigger file, performance can be an issue as Ed pointed out, in that case you can use awk alone:

awk 'NR==FNR{if(NR>1)l[$2]=1;next}{if(l[FNR])print $0}' f1.txt f2.txt

Another way, is to use xargs:

awk 'NR>1{print $2}' f1.txt | xargs -n1 -I {} sed -n {}p f2.txt


Use sed to construct a sed one-liner (in the case of file1 it'd output and run sed -n "55p;67p;" file2):

sed -n "$(sed -n '2~1{s/.* //;s/.*/&p/p}' file1)" file2

A good advertisement for awk, alas!