![Linux 第一个文件中的一行合并为第二个文件中的多行,转置反规范化](https://linux22.com/image/183458/Linux%20%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E4%B8%80%E8%A1%8C%E5%90%88%E5%B9%B6%E4%B8%BA%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%A4%9A%E8%A1%8C%EF%BC%8C%E8%BD%AC%E7%BD%AE%E5%8F%8D%E8%A7%84%E8%8C%83%E5%8C%96.png)
文件_1
Group Country Lang
IT USA ENG
文件_2
EMPID STOREID
1001 1400
1002 1401
1003 1401
如果我使用
paste -d'\t' File_1 File_2
我明白了
Group^ICountry^ILang^IEMPID^ISTOREID$
IT^IUSA^IENG^I1001^I1400$
^I1002^I1401$
^I1003^I1401$
当我试图得到这样的东西时
Group Country Lang EMPID STOREID
IT USA ENG 1001 1400
IT USA ENG 1002 1401
IT USA ENG 1003 1401
请建议
答案1
$ awk -v OFS='\t' 'NR==FNR{a[FNR==1]=$0; next} {print a[FNR==1], $0}' file1 file2
Group Country Lang EMPID STOREID
IT USA ENG 1001 1400
IT USA ENG 1002 1401
IT USA ENG 1003 1401
上面只是使用比较“这是文件的第一行”( FNR==1
) 的 1 或 0 结果来索引数组,这样当文件 1 的第一行是文件 2 和文件 2 的每隔一行与文件 1 的第二行关联的索引 0。它在任何 awk 中的行为方式都相同。
答案2
您可以用于awk
此任务。
awk '
FNR == NR {buf[NR] = $0; next}
{print (FNR==1 ? buf[1] : buf[2]) "\t" $0}
' file1 file2
解析第一个文件 ( ) 时保存标题和行,FNR==NR
并与第二个文件的每一行一起打印适当的前缀。
输出:
Group Country Lang EMPID STOREID
IT USA ENG 1001 1400
IT USA ENG 1002 1401
IT USA ENG 1003 1401
答案3
使用 GNU awk 尝试一下这一行:
$ awk 'FNR==NR {a[NR]=$0;nrow=FNR;next} NR==nrow+1 {print a[1],$0;next} {print a[2],$0}' data1 data2
Group Country Lang EMPID STOREID
IT USA ENG 1001 1400
IT USA ENG 1002 1401
IT USA ENG 1003 1401
和:
$ cat data1
Group Country Lang
IT USA ENG
$ cat data2
EMPID STOREID
1001 1400
1002 1401
1003 1401