首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合并两个表awk

合并两个表awk
EN

Stack Overflow用户
提问于 2017-08-01 19:08:10
回答 3查看 81关注 0票数 0

我有两个文件(均以制表符分隔):

database.txt

代码语言:javascript
运行
复制
MAR001;string1;H
MAR002;string2;G
MAR003;string3;H

data.txt

代码语言:javascript
运行
复制
data1;MAR002
data2;MAR003

我想使用MAR###列合并这两个表。预期输出(制表符分隔):

代码语言:javascript
运行
复制
data1;MAR002;string2;G
data2;MAR003;string3;H

我想使用awk;这是我的尝试:

代码语言:javascript
运行
复制
awk 'BEGIN{FS=OFS="\t"} FNR == NR { a[$2] = $1; next } $2 in a { print $0, a[$1] }' data.txt database.txt

但这失败了..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-01 19:23:37

代码语言:javascript
运行
复制
 awk -F '\t' 'FNR==1 && NR == 1 { strt=1 } FNR==1 && NR != 1 { strt=0} strt==1 {dat[$1]=$2";"$3 } strt==0 { if ( dat[$2] != "" ) { print $1";"$2";"dat[$2] } }' database.txt data.txt

首先读取database.txt,然后将数据读取到数组dat中。然后,当我们遇到data.txt文件时,检查dat数组中的条目并打印所需的数据(如果有)。

输出:

代码语言:javascript
运行
复制
data1;MAR002;string2;G
data2;MAR003;string3;H
票数 1
EN

Stack Overflow用户

发布于 2017-08-01 19:19:39

我将只使用join命令。这很简单:

代码语言:javascript
运行
复制
join -t \; -1 1 -2 2 database.txt data.txt
MAR002;string2;G;data1
MAR003;string3;H;data2

您可以使用-o指定输出列的顺序。例如:

代码语言:javascript
运行
复制
join -t \; -1 1 -2 2 -o 2.1,2.2,1.2,1.3 database.txt data.txt
data1;MAR002;string2;G
data2;MAR003;string3;H

附言:我假设你的文件是“分号分隔的”,而不是“制表符分隔的”。此外,您的文件还需要按键列排序。

票数 4
EN

Stack Overflow用户

发布于 2017-08-01 19:15:12

首先,;\t是不同的字符。如果您的实际输入文件是制表符分隔的,以下是代码的修复方法:

将您的代码更改为:

代码语言:javascript
运行
复制
awk '....... $1 in a { print a[$1], $0 }' data.txt database.txt
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45436132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档