程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了awk 提取一列并输出以列标题命名的文件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决awk 提取一列并输出以列标题命名的文件?

开发过程中遇到awk 提取一列并输出以列标题命名的文件的问题如何解决?下面主要结合日常开发的经验,给出你关于awk 提取一列并输出以列标题命名的文件的解决方法建议,希望对你解决awk 提取一列并输出以列标题命名的文件有所启发或帮助;

我有一个这样的 .txt 文件:

col1    col2    col3    col4
1   3   4   A
2   4   6   B
3   1   5   D
5   3   7   F

我想提取第 1 列之后的每一列 (i) 并将第 1 列和第 i 列输出到以第 i 列的标题命名的新文件中。

这意味着我将有三个分别名为“col2.reform.txt”、“col3.reform.txt”和“col4.reform.txt”的输出文件。

例如,输出“col2.reform.txt”文件将如下所示:

col1    col2
1   3
2   4
3   1
5   3

我像这样尝试了我的代码:

awk '{for (i=1; i <=NF; i++) print $1"\t"$i > ("{awk 'NR==1' $i}"".reform.txt")}' inputfile

显然“{awk 'NR==1' $i}”部分不起作用,我得到了一个名为 {awk 'NR==1' $i}.reform.txt 的文件。

如何正确获取文件名?谢谢!

PS:如何删除终端中的“{awk 'NR==1' $i}.reform.txt”文件?

编辑: 上面的列名只是一个例子。我更喜欢使用提取列名称标题的命令,因为我的文件实际上使用不同的词作为标题。

解决方法

根据您显示的示例,您能否尝试以下操作。使用 GNU desktop 中的示例编写。

awk

输出文件将使用名称创建,例如--> awk ' FNR==1{ for(i=1;i<=NF;i++){ heading[i]=$i } next } { for(i=2;i<=NF;i++){ close(outFile) outFile="col"i".reform.txt" if(!indVal[i]++){ print heading[1],heading[i] > (outFile) } print $1,$i >> (outFile) } } ' Input_file col2.reform.txtcol3.reform.txt 等等...

col4.reform.txt 内容示例如下:

col2.reform.txt

说明:为以上添加详细说明。

cat col2.reform.txt
col1 col2
1 3
2 4
3 1
5 3
,
$ awk '
    NR==1 { split($0,hdrs) }
    {
        for (i=2; i<=NF; i++) {
            out = hdrs[i]".reform.txt"
            if (FNR==1) {
                printf "" " > " out    # to erase exiting file contents if any
            }
            print $1,$i " >> " out
            close(out)
        }
    }
' file
 > col2.reform.txtcol1 col2 >> col2.reform.txt
 > col3.reform.txtcol1 col3 >> col3.reform.txt
 > col4.reform.txtcol1 col4 >> col4.reform.txt
1 3 >> col2.reform.txt
1 4 >> col3.reform.txt
1 A >> col4.reform.txt
2 4 >> col2.reform.txt
2 6 >> col3.reform.txt
2 B >> col4.reform.txt
3 1 >> col2.reform.txt
3 5 >> col3.reform.txt
3 D >> col4.reform.txt
5 3 >> col2.reform.txt
5 7 >> col3.reform.txt
5 F >> col4.reform.txt

当您完成测试并想要实际生成输出文件时,只需将 " > " 更改为 > 并将 " >> " 更改为 >>

,

这里有一个类似的...

$ awk 'NR==1 {n=split($0,h)} 
             {for(i=2;i<=n;i++) print $1,$i > (h[i]".reform.txt")}' file

==> col2.reform.txt <==
col1 col2
1 3
2 4
3 1
5 3

==> col3.reform.txt <==
col1 col3
1 4
2 6
3 5
5 7

==> col4.reform.txt <==
col1 col4
1 A
2 B
3 D
5 F

大佬总结

以上是大佬教程为你收集整理的awk 提取一列并输出以列标题命名的文件全部内容,希望文章能够帮你解决awk 提取一列并输出以列标题命名的文件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: