2016-04-26 111 views
1

文件1行號:

count line_num 
xy  55 
ab  67 

文件2:

a|b|c 
d|e|f 

我要打印55,67行號的文件2

正在嘗試:

#!/usr/bin/ksh 
while read file_name; do 
    line_num=`echo $file_name | awk '{print $2}'` 
    awk 'NR==$line_num{print;exit}' file2 >> file3.txt 
done < file1 

但不工作!

回答

1

可以使用awk在循環中讀取的行數和sed打印出具體線路:

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

如果你有一個更大的文件,性能是一個問題,艾德指出, ,在這種情況下,你可以使用awk獨自:

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

另一種方法,是使用xargs

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

+0

請確保您閱讀[爲什麼要使用shell循環處理文本考慮糟糕的做法](http://unix.stackexchange.com/questions/169716/why-is首先使用shell-loop-to-process-text-considered-bad-practice)。 –

+1

是的,如果它的大小適中,它將比普通的'awk'慢得多。 – 2016-04-26 19:40:55

+0

對,爲什麼** EVER **這樣做,因爲它甚至不比awk腳本簡單。順便說一句,從不使用字母'l'作爲變量名,因爲它看起來太像數字'1'(在某些字體中不可區分),因此混淆了您的代碼。 –

4

使用awk你可以這樣做:

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

我們反覆的第一個文件,並存儲第二列名爲line地圖(我們可以忽略的第一行是做NR>1頭,而是因爲它不」 t包含我們不需要的數字)。一旦第一個文件加載到地圖中,我們迭代第二個文件並打印出我們地圖中的線。 NRFNR是記憶行號的awk變量。

0

使用sed的構建sed的一行代碼(在它會輸出文件1的情況下,並運行sed -n "55p;67p;" file2):

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

好廣告awk,唉!

相關問題