shell 用另一个文件中的列替换一个列,跳过带有AWK的标题

dwthyt8l  于 12个月前  发布在  Shell
关注(0)|答案(2)|浏览(112)

我正在尝试使用AWK将一个文件中的列替换为另一个文件中的列。文件以制表符分隔。问题是第二个文件有一个头。因此,行的数量不相同。我不知道如何在一个文件中跳过第一行,但在另一个文件中不跳过。有什么建议吗?
谢谢
举例来说:
在这里,我提供了两个假设的文件(制表符分隔),我希望将file 1第2列的值替换为file 2第3列的值(“NewValue”)

文件1:

| | | |
| --|--|--|
| “ID_1”|“U”|“地点1”|
| “ID_2”|“U”|“地点2”|

file2:

| “识别码”|“姓名”|“新价值”|
| --|--|--|
| “ID_1”|A|“X”|
| “ID_2”|“B”|“Y”|

预期结果:

| | | |
| --|--|--|
| “ID_1”|“X”|“地点1”|
| “ID_2”|“Y”|“地点2”|
我尝试了下面的代码,但它没有工作。

awk 'NR>1 && NR==FNR{a[NR]=$0;next} {$2=a[FNR]}1' file2 file1
juzqafwq

juzqafwq1#

假设你想根据每个文件中的行的顺序而不是ID列的值来更改字段,如你的问题中的代码和你的评论中所述,然后使用任何awk:

$ awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[NR]=$3; next} {$2=a[FNR+1]} 1' file2 file1
"ID_1"  "X"     "Place1"
"ID_2"  "Y"     "Place2"
9q78igpj

9q78igpj2#

下面是一个只使用coreutil工具的方法。tail -n+2截断第一行,paste使用制表符逐行连接其输入,cut -f1,3,6输出(连接的)列1、3和6。

tail -n+2 file2 | paste - file1 | cut -f1,3,6
"ID_1"  "X" "Place1"
"ID_2"  "Y" "Place2"

相关问题