如何使用 AWK 循环遍历第一个文件并在第二个文件中的所有行旁边打印第一个文件中的每一行?

如何使用 AWK 循环遍历第一个文件并在第二个文件中的所有行旁边打印第一个文件中的每一行?

这是我想要实现的目标的一个例子。

文件一:

Adam
John
Tim

文件2:

,2018-2-1301
,2018-3-1379
,2018-1-3809
,2018-2-5801

输出:

Adam,2018-2-1301
Adam,2018-3-1379
Adam,2018-1-3809
Adam,2018-2-5801
John,2018-2-1301
John,2018-3-1379
John,2018-1-3809
John,2018-2-5801
Tim,2018-2-1301
Tim,2018-3-1379
Tim,2018-1-3809
Tim,2018-2-5801

谢谢!

答案1

$ awk 'NR == FNR { names[$1]; next }
                 { for (name in names) printf("%s%s\n", name, $0) }' file1 file2
Adam,2018-2-1301
Tim,2018-2-1301
John,2018-2-1301
Adam,2018-3-1379
Tim,2018-3-1379
John,2018-3-1379
Adam,2018-1-3809
Tim,2018-1-3809
John,2018-1-3809
Adam,2018-2-5801
Tim,2018-2-5801
John,2018-2-5801

这用于awk将第一个文件(具有三个名称的文件)读入关联数组(作为键)。当读取第二个文件时,第二个文件的每一行与之前读取的每个名称一起重复输出。

NR == FNR如果我们从第一个文件中读取,则测试为真。它用当前文件中的记录号测试总记录号(“行号”)。


你也可以做一个交叉连接像这样的GNU join

$ join -j 99 -o1.1,2.1 file[12]
Adam ,2018-2-1301
Adam ,2018-3-1379
Adam ,2018-1-3809
Adam ,2018-2-5801
John ,2018-2-1301
John ,2018-3-1379
John ,2018-1-3809
John ,2018-2-5801
Tim ,2018-2-1301
Tim ,2018-3-1379
Tim ,2018-1-3809
Tim ,2018-2-5801

...99其中 是两个文件中不存在的字段。

在此示例中,可以通过将结果通过管道来删除插入的空格tr -d ' '

答案2

这个怎么样?

$ cat names 
Adam
John
Tim

$ cat dates
,2018-2-1301
,2018-3-1379
,2018-1-3809
,2018-2-5801


$ while read name; do 
    while read date; do   
      n=`echo "$name" | awk '{print $1};'`
      d=`echo "$date" | awk '{print $1};'`
      echo "$n $d"
    done < dates
  done < names


Adam ,2018-2-1301
Adam ,2018-3-1379
Adam ,2018-1-3809
Adam ,2018-2-5801
John ,2018-2-1301
John ,2018-3-1379
John ,2018-1-3809
John ,2018-2-5801
Tim ,2018-2-1301
Tim ,2018-3-1379
Tim ,2018-1-3809
Tim ,2018-2-5801

答案3

你可以试试这个 awk :

awk 'NR==FNR{a[NR]=$0;b=NR;next}{for(i=1;i<=b;i++)print $0 a[i]}' File2 File1

相关内容