awk根据file1的条件打印file2的行

时间:2013-03-15 13:39:56

标签: awk

我有两个文件:

cat file1:

0 xxx
1 yyy
1 zzz
0 aaa

cat file2:

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列。

3 个答案:

答案 0 :(得分:1)

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

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(&gt; 0)< / p>

说明

  • NR是输入开头的当前记录编号
  • FNR是当前记录中当前记录的序号(因此NR与第二个文件中的FNR不同)
  • arr[NR]=$1:向第一列提供当前arr的数组NR
  • 如果NR!=FNR我们在下一个文件中,如果数组的值为1,那么我们打印

答案 1 :(得分:1)

不像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()

答案 2 :(得分:1)

awk '{
  getline value <"file2";
  if ($1)
    print value;
}' file1