3

我有两个文件:

猫文件1:

0 xxx
1 yyy
1 zzz
0 aaa

猫文件2:

A bbb
B ccc
C ddd
D eee

如何使用 awk 获得以下输出:

B ccc
C ddd

我的问题是,只有当 file1 中的某个字段(即字段 1)与某个值(即 1)匹配时,我如何从 file2 打印行?

附加信息:

文件 file1 和 file2 的行数相等。

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

file1 有 4 列。

file2 大约有 1000 列。

4

3 回答 3

3

尝试这样做(有点混淆):

awk 'NR==FNR{a[NR]=$1}NR!=FNR&&a[FNR]' file1 file2

在多行上它可以更清晰(提醒,awk像这样工作: condition{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隐式打印是表达式是TRUE(> 0)

解释

  • NR是从输入开始的当前记录的编号
  • FNR是当前文件中当前记录的序号(因此与第二个文件NR不同FNR
  • arr[NR]=$1:用第一列arr的当前索引馈送数组NR
  • 如果NR!=FNR我们在下一个文件中并且如果数组的值 if 1,那么我们打印
于 2013-03-15T13:43:01.270 回答
2

没有 awk 解决方案那么干净

$ paste file2 file1 | sed '/0/d' | cut -f1
B
C

您提到了有关数百万行的内容,为了只通过文件一次,我将求助于 python。可能是这样的(python 2.7):

with open("file1") as fd1, open("file2") as fd2:
    for l1, l2 in zip(fd1, fd2):
        if not l1.startswith('0'):
            print l2.strip()
于 2013-03-15T13:46:26.573 回答
2
awk '{
  getline value <"file2";
  if ($1)
    print value;
}' file1
于 2013-03-15T13:46:39.270 回答