Awk 使用Unix脚本根据输入交换/重新排列列及其值

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

团队

我需要根据输入更改/排序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,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。不确定我在这里做了什么错误,请说明我是如何无法正确获得结果的