Sorting 将行值与列值匹配,然后重命名该行
我有一个具有以下标题的文件: 文件1:Sorting 将行值与列值匹配,然后重命名该行,sorting,awk,match,Sorting,Awk,Match,我有一个具有以下标题的文件: 文件1: location, nameA, nameB, nameC 和第二个文件,格式如下: 文件2: ID_number, names 101, nameA 102, nameB 103, nameC 我希望将File1中的行名称与File2的第2列中的行名称进行匹配,如果匹配,则将标题中的名称替换为ID号。因此,最终生成的文件如下所示: 文件1:
location, nameA, nameB, nameC
和第二个文件,格式如下:
文件2:
ID_number, names
101, nameA
102, nameB
103, nameC
我希望将File1中的行名称与File2的第2列中的行名称进行匹配,如果匹配,则将标题中的名称替换为ID号。因此,最终生成的文件如下所示:
文件1:
location, 101, 102, 103
我一直在尝试用awk来做这件事,但我不能让它产生任何东西,我不知道如何要求它做我想要的最后一部分
awk -F "," '{print $2}' file2.csv | while read i; do awk 'NR=1;{for (j=0;j<=NF;j++) {if ($j == $i) printF $j; }}' file1.csv;done > test.csv
这是一个非常大的文件,有数千列和数千行,所以我在这里列出了我问题中文件的简化版本
谢谢 如果您的csv字段中没有嵌入逗号,则此操作应该有效。它还假设两个文件都有一个标题行
awk '
BEGIN { FS=","; OFS=", " }
FNR == 1 { # if it is the header line
if (NR != 1) # if it is the second file
print # print it
next # go to next line of file
}
{ gsub(/ +/, "") } # compress spaces
NR == FNR { # if it is the first file
a[$2] = $1 # save the info
next # go to next line of file
}
{
$2=a[$2]; $3=a[$3]; $4=a[$4] # swap names
print # print line
}
' file2.csv file1.csv
测试文件:
file1.csv
location, nameA, nameB, nameC
Earth, Chuck, Edward, Bob
The Moon, Bob, Doris, Al
文件2.csv
ID_number, names
101, Al
102, Bob
103, Chuck
104, Doris
105, Edward
输出:
location, nameA, nameB, nameC
Earth, 103, 105, 102
TheMoon, 102, 104, 101
你能告诉我a[$2]函数在做什么吗?我还想更改标题,而不是将“Chuck”、“Edward”和“Bob”更改为103105102-nameA、nameB和nameC将更改为103105102。