bash - 如何使用awk从两个文件中找出公共(public)列及其记录

标签 bash unix awk gawk

我有两个文件:

文件1:

id|name|address|country
1|abc|efg|xyz
2|asd|dfg|uio

文件 2(仅标题):

id|name|country

现在,我想要一个如下输出:

输出:

id|name|country
1|abc|xyz
2|asd|uio

基本上,我有一个用户记录文件(file1)和一个头文件(file2)。现在,我只想从( file1),其列与头文件中的列匹配。

我想使用 awk 或 bash 来完成此操作。

我尝试使用:

awk 'BEGIN { OFS="..."} FNR==NR { a[(FNR"")] = $0; next } { print a[(FNR"")], $0 > "test.txt"}' header.txt file.txt

不知道下一步该做什么。

谢谢

最佳答案

遵循awk可能会对您有所帮助。

awk -F"|" 'FNR==NR{for(i=1;i<=NF;i++){a[$i]};next} FNR==1 && FNR!=NR{for(j=1;j<=NF;j++){if($j in a){b[++p]=j}}} {for(o=1;o<=p;o++){printf("%s%s",$b[o],o==p?ORS:OFS)}}' OFS="|" File2  File1

现在也添加一种非单一内衬形式的解决方案。

awk -F"|" '
FNR==NR{
   for(i=1;i<=NF;i++){
     a[$i]};
   next}
FNR==1 && FNR!=NR{
   for(j=1;j<=NF;j++){
     if($j in a){ b[++p]=j }}
}
{
   for(o=1;o<=p;o++){
     printf("%s%s",$b[o],o==p?ORS:OFS)}
}
' OFS="|" File2  File1

由 Ed Morton 编辑:FWIW 这是使用正常缩进/间距和几个更有意义的变量名称编写的相同脚本:

BEGIN { FS=OFS="|" }
NR==FNR {
    for (i=1; i<=NF; i++) {
        names[$i]
    }
    next
}
FNR==1 {
    for (i=1; i<=NF; i++) {
        if ($i in names) {
            f[++numFlds] = i
        }
    }
}
{
    for (i=1; i<=numFlds; i++) {
        printf "%s%s", $(f[i]), (i<numFlds ? OFS : ORS)
    }
}

关于bash - 如何使用awk从两个文件中找出公共(public)列及其记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50371379/

相关文章:

Awk:使用反向匹配字符串然后替换字符

linux - 根据文件中的不同列排序和删除重复项

bash - 如何在 pg_dump 中传递日志文件

linux - 关闭ssh连接后如何保持任务运行?

linux - 无法让 nohup、open_init_pty 和 sudo 一起工作

c - 复制字符串时出现段错误

Bash - 如何避免命令 "eval set --"评估变量

shell - UNIX Shell 终止命令

bash - 合并两个文件

bash - 仅当重定向到管道或文件时 awk 才没有输出