首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用awk合并具有相同列的两个文件的数据

问使用awk合并具有相同列的两个文件的数据
EN

Stack Overflow用户
提问于 2021-02-28 00:40:10
回答 3查看 78关注 0票数 1

我有两个文件: file1和file2。我想合并file1和file2之间的时间,公共列是1和2。我需要创建一个单独的文件,其中包含file1数据和file2映射时间列。但对于某些整体(参见粗体文本),它与file2中的同一行匹配。我的命令有什么问题?有什么方法可以获得预期的输出吗?

注意:可以有2个以上的条目,如粗体文本所示。只有时间改变时,column1和column2条目可以相同。

文件1

9950 |p| 2021-02-27 14:16:21.905

9951 |Q| 2021-02-27 14:16:28.845

9954 |r| 2021-02-27 14:17:21.884

9954 |r| 2021-02-27 14:19:46.775

9956年|y| 2021-02-27 14:20:20.830

9957 |z| 2021-02-27 14:20:27.325

文件2

9950 |p| 2021-02-27 14:16:22.086

9951 |Q| 2021-02-27 14:16:29.033

9954 |r| 2021-02-27 14:17:22.072

9954 |r| 2021-02-27 14:19:46.956

9956年|y| 2021-02-27 14:20:21.018

9957 |z| 2021-02-27 14:20:27.512

命令:

代码语言:javascript
复制
awk -F'|' 'NR==FNR{a[$1,$2]=$3;next} a[$1,$2]{print $0"\t"a[$1,$2]}' file2 file1

输出:

9950 |p| 2021-02-27 14:16:21.905 | 2021-02-27 14:16:22.086

9951 |Q| 2021-02-27 14:16:28.845 | 2021-02-27 14:16:29.033

9954 |r| 2021-02-27 14:17:21.884 | 2021-02-27 14:19:46.956

9954 |r| 2021-02-27 14:19:46.775 | 2021-02-27 14:19:46.956

9956 |x| 2021-02-27 14:20:20.830 | 2021-02-27 14:20:21.018

9957 |y| 2021-02-27 14:20:27.325 | 2021-02-27 14:20:27.512

预期输出:

9950 |p| 2021-02-27 14:16:21.905 | 2021-02-27 14:16:22.086

9951 |Q| 2021-02-27 14:16:28.845 | 2021-02-27 14:16:29.033

9954 |r| 2021-02-27 14:17:21.884 | 2021-02-27 14:17:22.072

9954 |r| 2021-02-27 14:19:46.775 | 2021-02-27 14:19:46.956

9956 |x| 2021-02-27 14:20:20.830 | 2021-02-27 14:20:21.018

9957 |y| 2021-02-27 14:20:27.325 | 2021-02-27 14:20:27.512

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-28 01:37:27

与James Brown的答案类似,但只需要保留一个"count“数组,并使用$1加$2作为键

代码语言:javascript
复制
gawk -F '|' '
    FNR == 1 {delete count}
    {key = $1 SUBSEP $2 SUBSEP (++count[$1,$2])}
    FILENAME == ARGV[1] {time[key] = $3; next}
    key in time {print $0, FS, time[key]}
' file2 file1
票数 3
EN

Stack Overflow用户

发布于 2021-02-28 00:48:50

代码语言:javascript
复制
$ awk '
BEGIN {
    FS=" [|] "
    OFS=" | "
}
NR==FNR {
    a[$1,++c[$1]]=$0          # c[$1] is an instance counter array, 
    next                      # unique for each $1
}
{
    print a[$1,++d[$1]],$NF   # so is d[$1]
}' file1 file2

输出:

代码语言:javascript
复制
9950 | p | 2021-02-27 14:16:21.905 | 2021-02-27 14:16:22.086
9951 | q | 2021-02-27 14:16:28.845 | 2021-02-27 14:16:29.033
9954 | r | 2021-02-27 14:17:21.884 | 2021-02-27 14:17:22.072
9954 | r | 2021-02-27 14:19:46.775 | 2021-02-27 14:19:46.956
...

更新

来自评论的请求:

代码语言:javascript
复制
$ awk '
BEGIN {
    FS=" [|] "
    OFS=" | "
}
NR==FNR {
    a[$1,++c[$1]]=$0          # c[$1] is an instance counter array, 
    next                      # unique for each $1
}
(($1,++d[$1]) in a) {         # only output if match in both files
    print a[$1,d[$1]],$NF     # so is d[$1]
}' file1 file2
票数 3
EN

Stack Overflow用户

发布于 2021-02-28 01:39:46

如果这不是您需要的全部,那么编辑您的问题,以提供更具代表性的样本输入/输出,包括不适用于此的情况:

代码语言:javascript
复制
$ paste file1 file2 | awk '{$7=$8=$9=""; $0=$0; $1=$1}1'
9950 | p | 2021-02-27 14:16:21.905 | 2021-02-27 14:16:22.086
9951 | q | 2021-02-27 14:16:28.845 | 2021-02-27 14:16:29.033
9954 | r | 2021-02-27 14:17:21.884 | 2021-02-27 14:17:22.072
9954 | r | 2021-02-27 14:19:46.775 | 2021-02-27 14:19:46.956
9956 | y | 2021-02-27 14:20:20.830 | 2021-02-27 14:20:21.018
9957 | z | 2021-02-27 14:20:27.325 | 2021-02-27 14:20:27.512

在上面的

将这些字段设置为

字符串,但不会更改中的字段数

,然后

导致awk重新分割

从而将这些字段作为单独的字段删除,但不会改变它们所在位置周围的空白,然后

导致awk重建

从它的字段替换每个匹配的字符串

(例如,连续的空格)与匹配的字符串

(即单个空白字符)。例如(with

添加以使空间更清晰可见):

代码语言:javascript
复制
$ echo 'a b c' | awk '{print NF, $0}' | tr ' ' '-'
3-a-b-c
$ echo 'a b c' | awk '{$2=""; print NF, $0}' | tr ' ' '-'
3-a--c
$ echo 'a b c' | awk '{$2=""; $0=$0; print NF, $0}' | tr ' ' '-'
2-a--c
$ echo 'a b c' | awk '{$2=""; $0=$0; $1=$1; print NF, $0}' | tr ' ' '-'
2-a-c
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66401036

复制
相关文章

相似问题

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