【问题标题】:Making a new file using another as template in BASH在 BASH 中使用另一个作为模板创建一个新文件
【发布时间】:2012-03-11 00:14:48
【问题描述】:

我有两个文件,例如:

文件_1

c1,c2,c3,c4

文件_2

c1,c3,c2,c4

DA,CA,DD,CD

因此,我想使用 BASH 以文件 1 作为模型来制作文件 3:

文件_3

c1,c2,c3,c4

DA,DD,CA,CD

在此示例中,File_1 是列正确配置的模型,File_2 具有列及其各自的信息,但配置错误。因此,File_3 以file_1 为模板,对file_2 中的信息进行了正确的排序。

在示例中我只给出了 4 列,但我的真实文件有 402 列。 所以,做一个

awk -F"," '{print $1","$3","$2","$4}' File_2

或类似的东西,将不起作用,因为我不知道 File_1 在 File_2 中的位置(例如,File_2 中的 c1 列可能在第六、第二或最后一列位置) .

我希望你能帮助我使用 BASH(如果可能的话),我想对脚本做一个简单的解释,因为我是新手,不太了解命令。

提前致谢。

【问题讨论】:

    标签: bash


    【解决方案1】:

    您可以像这样制作标题索引映射:

    File_2  =>  File_1
    ------      ------
    1       =>  1
    2       =>  3
    3       =>  2
    4       =>  4
    

    awk -F, '
        FNR==NR{
            for(i=1;i<=NF;i++)
                a[$i]=i
            print
            nextfile
        }
        FNR==1{
            for(j=1;j<=NF;j++)
                b[j]=a[$j]
            next
        }
        {
            for(k=1;k<=NF;k++)
                printf( "%s%s",$b[k], k==NF?"\n":",")
        }
    ' File_{1,2}
    

    注意:如果File_{1,2} 不包含空行,则此命令有效!

    【讨论】:

    • 谢谢凯夫。它工作得很好。我有超过 100,000 行,并且可以按我的意愿快速工作。您建议我阅读哪个网站来理解脚本?
    • 只是基本的awk 东西:for...loopprintfnext/nextfileNR/FNR。我想你可以在几分钟内理解它们。
    【解决方案2】:

    如果您可以随意更改文件 2 的格式:

    File_2
    c1,c3,c2,c4    
    DA,CA,DD,CD
    

    到:

    s/c1/DA/g
    s/c3/CA/g
    s/c2/DD/g
    s/c4/CD/g
    

    你可以使用 sed:

    sed -f File_2 File_1 > File_3
    

    否则您可以使用数组:

    key=($(head -n1 File_2 | tr "," " "))
    val=($(tail -n1 File_2 | tr "," " "))
    len=${#key[*]}
    for i in $(seq 0 $((len-1))); do echo s/${key[$i]}/${val[$i]}/g; done > subst.sed 
    sed -f subst.sed File_1 > File_3 
    

    生成的sed-Program就是上面那个。如果替换与以下命令的键匹配,您可能会得到意想不到的结果。如果你只想匹配整个单词,你必须稍微改变一下 sed 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多