2017-10-03 2 views
1

ファイルの行を印刷するにはcat、tail、headまたはgrepなどが使用できます。 。私はそれを理解できませんでした。第3のファイルに格納されている行番号に従って2つのファイルから行を印刷する方法

私は2つのファイルを持っていて、3番目のファイルに行番号が存在する場合は、この2つのファイルの行を並べて印刷します。

ファイルAを:

たとえば、次のようにのが私の最初の二つのファイルを言わせ

FileA first sentence 
FileA second sentence 
FileA third sentence 

ファイルB:

FileB BBfirst sentence 
FileB BBsecond sentence 
FileB BBthird sentence 

と、以下のようにファイルCがあることができます:

ファイルC:

3 
    1 

だから、私は以下のように印刷したい:

FileA third sentence  FileB BBthird sentence 
    FileA first sentence FileB BBfirst sentence 

はどのように私はそれを行うことができますか?救助へ

答えて

1

のawk:

ソリューション第一:私はFile_Cの数字の最高値を取り、その配列によって最後のトラバースで、配列に値を格納FILEAとFILEBからい

awk 'FNR==NR{a[$0];len=len>$0?len:$0;next} (FNR in a){array[FNR]=array[FNR]?array[FNR] OFS $0:$0} END{for(j=1;j<=len;j++){if(array[j]){print array[j]}}}' fileC fileA fileB 

解決策の1つではないライナーも追加しています。

awk ' 
FNR==NR{ 
    a[$0]; 
    len=len>$0?len:$0; 
    next 
} 
(FNR in a){ 
    array[FNR]=array[FNR]?array[FNR] OFS $0:$0 
} 
END{ 
    for(j=1;j<=len;j++){ 
    if(array[j]){ 
     print array[j] 
} 
} 
} 
' fileC fileA fileB 

出力は以下の通りです。

FileA first sentence FileB BBfirst sentence 
FileA third sentence FileB BBthird sentence 

ソリューション第二:ここで私たちはそのように非常に最初の行がFILEAとFILEBのために来たときに、単純に配列にその発生ごとなどの要素を保存し、変数の値をリセットし、FILECから任意の最大桁の概念を使用していませんforループのいくつかのサイクルを節約することができます(私たちは私の解決策ではできなかった)。

awk ' 
FNR==NR{ 
a[$0]; 
next 
} 
FNR==1{ 
i="" 
} 
(FNR in a){ 
++i; 
array[i]=array[i]?array[i] OFS $0:$0 
} 
END{ 
for(j=1;j<=i;j++){ 
    if(array[j]){ 
    print array[j] 
} 
} 
} 
' file_c file_a file_b 

出力は以下の通りである。

FileA first sentence FileB BBfirst sentence 
FileA third sentence FileB BBthird sentence 
関連する問題