我有两个文件: 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
命令:
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
发布于 2021-02-28 01:37:27
与James Brown的答案类似,但只需要保留一个"count“数组,并使用$1加$2作为键
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发布于 2021-02-28 00:48:50
$ 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输出:
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
...更新
来自评论的请求:
$ 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发布于 2021-02-28 01:39:46
如果这不是您需要的全部,那么编辑您的问题,以提供更具代表性的样本输入/输出,包括不适用于此的情况:
$ 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
添加以使空间更清晰可见):
$ 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-chttps://stackoverflow.com/questions/66401036
复制相似问题