【问题标题】:Paste columns side by side on many files using awk使用 awk 在许多文件上并排粘贴列
【发布时间】:2017-08-29 06:24:40
【问题描述】:

我已经在这个问题上苦苦挣扎了很长一段时间(请注意,我不是一个非常好的 bash 编码器,更不用说 awk)。 我有大约 10000 个文件,每个文件的格式都相同(也很重,大约 3Mb)。我想获取每个文件的第三行并将它们并排粘贴到一个新文件中。

我找到了许多使用 paste、awk 或 cut 的解决方案,但在使用通配符时它们都不起作用。例如,

paste <(awk '{print $3}' file1 ) <(awk '{print $3}' file2 ) <(awk '{print $3}' file3) > output

如果我只有 3 个文件会很好,但我不会为其中的 10000 个文件输入。所以我尝试了使用通配符:

paste <(awk '{print $3}' file* ) > output

它确实粘贴了第 3 行,但在一行中。我尝试了其他一些代码,但最终总是得到相同的结果。有没有办法使用通配符将它们并排粘贴?

非常感谢您的帮助!

巴蒂斯特 G.

编辑 1:在 schorsch312 的帮助下,我找到了一个可行的解决方案 为了我。而不是获取列并将它们并排粘贴, 我将每一列打印为一行并将它们一个接一个地添加:

对于我在ls files*;做 awk '{printf $3i" "}END{print}' $i >> 输出完成

它可以工作,但 1/ 速度很慢,2/ 这不是我问的 在标题中,因为我的输出文件是“转置”。它真的没有 对我来说很重要,因为它只是浮动,我可以稍后转置它 如果需要,使用 python。

【问题讨论】:

    标签: bash unix awk paste


    【解决方案1】:

    我知道你单独说 awk,但我不知道该怎么做。这是一个简单的 bash 脚本,它可以做你喜欢做的事情。

    # do a loop over all your files 
    for i in `ls file*`; do 
        # use awk to get the 3rd row for all files and save output
        awk '{print $3}' $i > row_$i  
    done
    
    # now paste your rows together.
    paste row_* > output
    
    # cleanup
    rm row_*
    

    【讨论】:

    • 感谢您的回答。我真的不在乎它是否不是单线解决方案,只要可行。但是,此解决方案不起作用,因为 paste 不允许我操作这么多文件:> paste: row_fault_01021.xyz: Too many open files
    • :-) 您可以在 for 循环中使用 paste(粘贴输出 row_$i >> 输出)。您需要使用 >> 来覆盖输出。
    • 我虽然是这样,但由于某些原因,循环在 1 次迭代后卡住了(不再计算任何内容)。但是,根据您的循环想法,我找到了一个可行的解决方案(我编辑了我的帖子)。谢谢!
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2017-06-05
    • 1970-01-01
    相关资源
    最近更新 更多