基于文件1的条件的文件2的awk打印行
我有两个文件: cat文件1:基于文件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
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