【问题标题】:how to copy and paste multiple columns with awk如何使用 awk 复制和粘贴多个列
【发布时间】:2019-08-01 13:35:18
【问题描述】:

我正在尝试将第六列从一堆文件中复制并粘贴到一个文件中,并将每一列粘贴在单独的列中(而不是一个接一个地粘贴在一个列中。)

我尝试了这段代码,但它只能部分工作,因为它只复制和粘贴每列的 50 行而不是总数 114

 awk 'FNR==1{f++}{a[f,FNR]=$6}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' *.label > fname.txt     

【问题讨论】:

  • awk 'FNR==1{f++}{a[f,FNR]=$6}END{for(x=1;x fname.txt
  • 使用edit按钮更新您的问题,不要在其下的cmets中添加代码或其他任何内容。此外,请通过缩进 4 个空格来格式化您的代码(或使用编辑器 {} 按钮)并提供简洁、可测试的示例输入和预期输出(在示例输入、输出和代码中使用 4 或 5 列,而不是 115) .
  • 哇,这段代码难以辨认,但给我留下了深刻的印象:当我运行它时,它完全按照您的描述执行,获取了我创建的测试文件中的所有行。您可能需要指定您的 awk 版本和您运行的平台,以防万一。
  • 哦,我刚刚注意到,只要最后一个文件到达最后一行,它就会停止。你的文件有不同的行数吗?所以在我看来你需要max{FNR from each file} 而不是FNR,我现在收集的是最后一个文件读取的最后行号。

标签: bash awk multiple-columns


【解决方案1】:

问题是END子句中的FNR是最后一个文件的行数。如果该文件比其他文件短,则仅打印该行数。保存最大的文件长度,然后在for 循环中使用它将使您的代码按预期工作。

  awk 'FNR==1{f++}{a[f,FNR]=$6; if (FNR > longest) {longest = FNR} }END{for(x=1; x <= longest ;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' *.label > fname.txt     

【讨论】:

    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    相关资源
    最近更新 更多