Linux 第一个文件中的一行合并为第二个文件中的多行,转置反规范化

Linux 第一个文件中的一行合并为第二个文件中的多行,转置反规范化

文件_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

相关内容