如何对多个文件应用awk命令以提取行?

时间:2018-08-17 06:56:45

标签: linux awk

我有两个主要文件

1)Bigfile有99百万行。我已将大块切成小块。
2)File2还有一些其他信息。

  Majorfiles information is below :- 

  Bigfile
  Col1  Col2  Col3  Col4  
  A      1     A     T
  A      2     A     T
  A      3     G     C
  A      4     C     G
  A      5     G     T
  A      6     T     A

 File2
 Col1   Col2  Col3      
 A       4    Usefull 
 A       6    NonUsefull

大文件被分割成小块,因此所有小块都具有我上面为大文件提供的相同信息。

我想要的是

file3

 Col1  Col2  Col3  Col4  
  A      4     C     G
  A      6     T     A

我尝试了

awk 'BEGIN { while ((getline<"Bigfile")>0) {REC[$2]=$0}} {print REC[$2]}'  <   file2 > file3

但是因为这是一个有99百万行的巨大文件,所以我没有得到输出。而如果我分成100000行,则会得到输出。因此,我尝试使用以下命令将文件拆分为较小的块

split -l 100000 -d Bigfile.txt smallfile- --additional-suffix=.txt

然后我使用下面的代码将所有文件放入循环

files=`ls *txt | sed "s|ls *txt||"` 

for i in $files
do
R1=${i}.txt #join
echo `awk 'BEGIN { while ((getline<"$R1")>0) {REC[$2]=$0}} {print REC[$2]}' <   file2 > file_${i}`
done

但是file _ $ {i}给我的文本文件仅包含命令

“ awk'BEGIN {而((getline <” $ R1“)> 0){REC [$ 2] = $ 0}} {print REC [$ 2]}”

我没有预期的输出。

1 个答案:

答案 0 :(得分:0)

我将使用join而不是awk

join -1 1 -1 2 -2 1 -2 2 -o "1.1, 1.2, 2.3, 2.4"  smallfile bigfile

输出:

Col1 Col2 Col3 Col4
A 4 C G
A 6 T A
如果希望输出与期望的间距相匹配,请使用

输送到column -t。 (注意:join在文件中的行数方面似乎是线性的:https://unix.stackexchange.com/questions/441369/unix-join-command-complexity