我有两个文件:
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列。
答案 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