如何根据存储在第三个文件中的行号从两个文件中打印行

时间:2017-10-03 17:21:17

标签: linux awk sed text-processing

我知道要打印文件的行,我可以使用cat,tail,head或grep等。但我的问题对我来说有点复杂。我无法弄明白。

我有两个文件,如果第三个文件中存在行号,我想并排打印这两个文件中的行。

例如,让我们说我的前两个文件如下:

档案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 个答案:

答案 0 :(得分:1)

要求救援:

解决方案1:我在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

现在也添加非单线形式的解决方案。

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

解决方案第二:这里我没有使用来自filec的任何最大数字概念,只需将元素按照它们的出现保存到数组中,并在文件的第一行出现时重置变量的值和fileb,以便我们可以保存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