Awk 使用Unix脚本根据输入交换/重新排列列及其值
团队 我需要根据输入更改/排序csv文件列 例如:Awk 使用Unix脚本根据输入交换/重新排列列及其值,awk,Awk,团队 我需要根据输入更改/排序csv文件列 例如: PRODUCTCODE,SITE,BATCHID,LV1P_DESCRIPTION MK3,Biberach,15200100_3,Biologics Downstream MK3,Biberach,15200100_4,Sciona Upstream MK3,Biberach,15200100_5,Drag envois MK3,Biberach,15200100_8,flatsylio MK3,Biberach,15200100_1,bio
PRODUCTCODE,SITE,BATCHID,LV1P_DESCRIPTION
MK3,Biberach,15200100_3,Biologics Downstream
MK3,Biberach,15200100_4,Sciona Upstream
MK3,Biberach,15200100_5,Drag envois
MK3,Biberach,15200100_8,flatsylio
MK3,Biberach,15200100_1,bioCovis
PRODUCTCODE,BATCHID
MK3,15200100_3
MK3,15200100_4
MK3,15200100_5
MK3,15200100_8
MK3,15200100_1
数据文件(源文件)将始终包含标准列及其值示例:
PRODUCTCODE,SITE,BATCHID,LV1P_DESCRIPTION
MK3,Biberach,15200100_3,Biologics Downstream
MK3,Biberach,15200100_4,Sciona Upstream
MK3,Biberach,15200100_5,Drag envois
MK3,Biberach,15200100_8,flatsylio
MK3,Biberach,15200100_1,bioCovis
PRODUCTCODE,BATCHID
MK3,15200100_3
MK3,15200100_4
MK3,15200100_5
MK3,15200100_8
MK3,15200100_1
这些列(PRODUCTCODE、SITE、BATCHID、LV1P_DESCRIPTION)将是源文件的标准列,我正在寻找解决方案来格式化这些列,并使用我们喜欢的列生成新文件
注意:源/数据文件将始终以逗号分隔
示例:若我将PRODUCTCODE、BATCHID作为输入传递,那个么我只希望从源文件中提取这些列及其数据并生成新文件
类似于脚本名称的东西
目标文件示例:
PRODUCTCODE,SITE,BATCHID,LV1P_DESCRIPTION
MK3,Biberach,15200100_3,Biologics Downstream
MK3,Biberach,15200100_4,Sciona Upstream
MK3,Biberach,15200100_5,Drag envois
MK3,Biberach,15200100_8,flatsylio
MK3,Biberach,15200100_1,bioCovis
PRODUCTCODE,BATCHID
MK3,15200100_3
MK3,15200100_4
MK3,15200100_5
MK3,15200100_8
MK3,15200100_1
若我将output_列作为“LV1P_DESCRIPTION,PRODUCTCODE”传递,那个么输出文件应该如下所示
LV1P_DESCRIPTION,PRODUCTCODE
Biologics Downstream,MK3
Sciona Upstream,MK3
Drag envios,MK3
flatsylio,MK3
bioCovis,MK3
如果有人能帮上忙,那就太好了
我尝试过使用一些awk脚本(从某个站点获得),但它并没有像预期的那样工作,因为我没有unix知识,无法找到修改它的困难
awk代码:
BEGIN {
FS = ","
}
NR==1 {
split(c, ca, ",")
for (i = 1 ; i <= length(ca) ; i++) {
gsub(/ /, "", ca[i])
cm[ca[i]] = 1
}
for (i = 1 ; i <= NF ; i++) {
if (cm[$i] == 1) {
cc[i] = 1
}
}
if (length(cc) == 0) {
exit 1
}
}
{
ci = ""
for (i = 1 ; i <= NF ; i++) {
if (cc[i] == 1) {
if (ci == "") {
ci = $i
} else {
ci = ci "," $i
}
}
}
print ci
}
以下GNU awk解决方案应满足您的目标:
awk -F, -v flds="LV1P_DESCRIPTION,PRODUCTCODE" 'BEGIN { split(flds,map,",") } NR==1 { for (i=1;i<=NF;i++) { map1[$i]=i } } { printf "%s",$map1[map[1]];for(i=2;i<=length(map);i++) { printf ",%s",$map1[map[i]] } printf "\n" }' file
awk-F,-v flds=“LV1P_DESCRIPTION,PRODUCTCODE”'BEGIN{split(flds,map,”)}NR==1{for(i=1;为了更好地理解您的问题,请使用代码标记修复您的示例,谢谢。我刚刚格式化了示例。您搜索了什么,找到了什么?您尝试了什么,它是如何失败的?首先,我对UNIX脚本没有很好的了解,无法进行更多的云集成。下面的代码是我保存它时使用的作为.awk文件,但当我的数据文件中有更多的4-5个字段时,它会失败(i=1;i Hi Raman,感谢您的回复!我已经测试了代码及其工作状态,但我这边有一个问题,我将无法在现有流程中找到列位置,而我将获得如下列名称var1=“BATCHID,LV2P\u DESCRIPTION”。不确定您是否能帮上忙?。我也会尝试在我的过程中通过一些查找逻辑来获取位置,这样我就可以使用您的代码了。还有我注意到的其他一点-上面的解决方案在文件中的行结尾处使用逗号,如果注意到它将转到下一行LV2P_DESCRIPTION,SITE,BATCHID,dscs,SITE,batch123,好的,我已经完成了修改了答案以找到列号并相应地使用它们。我不确定你说的“文件末尾除了逗号”是什么意思我已经使用了您的样本数据,最后没有逗号。感谢Raman提供的巨大帮助,我会在某个时间检查并更新您。你好,Raman。不确定我在这里做了什么错误,请说明我是如何无法正确获得结果的