使用列标题写入变量来替换不同csv文件中的列(使用awk)

问题描述 投票:0回答:1

我一直致力于使 bash 脚本通用,以便它允许输入具有不同列数的 csv 文件。

我想用不同 csv 文件中的另一列替换 csv 文件中的一列。我知道如何使用列号执行此操作,但列号可能会有所不同,因此我想改用这两列的标题。

这些是我的文件

cat test4.csv

2xedni
GCGATTAC
CATCACTT

cat test1.csv

Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,I5_Index_ID,index2,Sample_Project,Description
1,O_bru,1,A01,UDI_55,GACAGTAA,UDI_55,GTAATCGC,,
2,A_lych,1,B01,UDI_56,CCTTCGCA,UDI_56,AAGTGATG,,

我想要的输出是test5.csv

Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,I5_Index_ID,index2,Sample_Project,Description
1,O_bru,1,A01,UDI_55,GACAGTAA,UDI_55,GCGATTAC
2,A_lych,1,B01,UDI_56,CCTTCGCA,UDI_56,CATCACTT

我考虑过以这种方式在 awk 命令中使用变量

var1=$(awk '$1=="2xedni" {p=1} p' test4.csv)
var2=$(awk '$1=="index2" {p=1} p' test1.csv)

awk -v var="$var1" -v varr="$var2" 'FNR==NR{a[NR]=var;next}{varr=a[FNR]}1' test4.csv test1.csv > test5.csv 

我得到的只是 test4.csv 并且列的替换尚未发生。

我注意到当我 echo $var2 为空时,所以我猜这也是问题所在?

我做错了什么吗?有什么建议吗?

谢谢朱莉娅

bash csv variables awk
1个回答
0
投票

我做错了什么吗?

这段代码

awk -v var="$var1" -v varr="$var2" 'FNR==NR{a[NR]=var;next}{varr=a[FNR]}1' test4.csv test1.csv > test5.csv

仅更改

a
数组和
varr
变量值,它对行的字段没有任何作用,因此
1
只按原样打印行。

有什么建议吗?

首先,您应该通知 GNU

AWK
使用
,
作为字段分隔符 (
FS
) 和输出字段分隔符 (
OFS
)。您应该为行的字段分配值,请考虑以下示例,假设您有
file.csv

Able,Baker,Charlie
1,2,3
4,5,6

并且您需要通过提供其名称来设置列中的所有零,那么您可以这样做

awk -v col="Baker" 'BEGIN{FS=OFS=","}NR==1{for(i=1;i<=NF;i+=1){columns[$i]=i};print}NR>1{$(columns[col])=0;print}' file.csv

提供输出

Able,Baker,Charlie
1,0,3
4,0,6

说明:我告知 GNU

AWK
,
既是字段分隔符 (
FS
) 又是输出字段分隔符 (
OFS
),在处理第一行时,我填充数组列,因此键是名称,位置是值,
print 
第一行不变。对于后面的行,我使用创建的数组查找列的位置,并将该字段的值设置为零。

(在 GNU Awk 5.1.0 中测试)

© www.soinside.com 2019 - 2024. All rights reserved.