基于文件1的条件的文件2的awk打印行

基于文件1的条件的文件2的awk打印行,awk,Awk,我有两个文件: cat文件1: 0 xxx 1 yyy 1 zzz 0 aaa cat文件2: A bbb B ccc C ddd D eee 如何使用awk获得以下输出: B ccc C ddd 我的问题是,仅当文件1中的某个字段(即字段1)与某个值(即1)匹配时,如何从文件2打印行 其他信息: 文件file1和file2的行数相等 文件file1和file2有数百万行,无法读入内存 file1有4列 file2大约有1000列。尝试这样做(有点模糊): 在多行上,它可以更清晰(提醒,a

我有两个文件:

cat文件1:

0 xxx
1 yyy
1 zzz
0 aaa
cat文件2:

A bbb
B ccc
C ddd
D eee
如何使用awk获得以下输出:

B ccc
C ddd
我的问题是,仅当文件1中的某个字段(即字段1)与某个值(即1)匹配时,如何从文件2打印行

其他信息:

文件file1和file2的行数相等

文件file1和file2有数百万行,无法读入内存

file1有4列

file2大约有1000列。

尝试这样做(有点模糊):

在多行上,它可以更清晰(提醒,
awk
的工作原理如下:
条件{action}

awk '
    NR==FNR{arr[NR]=$1}
    NR!=FNR && arr[FNR] 
' file1 file2
如果删除代码段中的“聪明”部分:

awk '
    if (NR == FNR) {arr[NR]=$1}
    if (NR != FNR && arr[FNR]) {print $0} 
' file1 file2
awk
单独查找一个条件(无操作)时,如
NR!=FNR&&arr[FNR]
,默认情况下,它在
STDOUT
上隐式打印,表示表达式为
真(>0)

解释
  • NR
    是从输入开始的当前记录的编号
  • FNR
    是当前文件中当前记录的序号(因此
    NR
    不同于第二个文件中的
    FNR
  • arr[NR]=$1
    :使用当前
    NR
    的标记和第一列馈送数组
    arr
  • 如果
    NR!=FNR
    我们在下一个文件中,如果数组的值为
    1
    ,则我们打印

    • 没有awk溶液那么干净

      $ paste file2 file1 | sed '/0/d' | cut -f1
      B
      C
      
      您提到了数百万行,为了只对文件进行一次传递,我会使用python

      awk'{
      
      getline值它在我指定的输入上工作。但是,我在文件1和文件2中有多个字段。我将编辑我的问题。贴子将进行相应的编辑,并附有解释,不需要的
      打印
      确实已被删除。谢谢。我今天晚些时候会接受答案。谢谢你也提供了解释!我实际上无法使用你它需要太多的内存。我必须使用wau提供的解决方案。Python绝对是一个选项(如果sputnick没有为我提供awk解决方案,我打算使用它)。谢谢你的建议。我最终使用了你的粘贴解决方案,它使用的内存不到20MB,运行时间不到30秒。我做到了:粘贴file1 file2 | awk'{if($1==1)print}'|剪切-f2@tommy.carstensen-很好,很高兴我能帮忙。我发现一个语法错误:awk:{getline value如果它都在一行上,你必须在getline命令之后添加一个分号(我更新了添加它的代码)你的解决方案也可以工作。我将测试它们(你的和sputnick的)并看看哪一个更快。当我使用此方法时,我还超过了我的100MB内存阈值。似乎我将不得不求助于Python。
      $ paste file2 file1 | sed '/0/d' | cut -f1
      B
      C
      
      with open("file1") as fd1, open("file2") as fd2:
          for l1, l2 in zip(fd1, fd2):
              if not l1.startswith('0'):
                  print l2.strip()
      
      awk '{
        getline value <"file2";
        if ($1)
          print value;
      }' file1