【问题标题】:Bash - How to format file in orderly manner?Bash - 如何有序地格式化文件?
【发布时间】:2014-07-10 04:36:08
【问题描述】:

这让我发疯了......

我有一个文件BookDB.txt,它以以下格式存储数据:

Python for dummies:Pauline:10.45:4:3
Python for dummies:Peter:10.67:0:11
C++ for dummies:Jared Loo:10.56:1:9

我想通过使用以下命令将 (:) 分隔符替换为 (/t) 来打印所有书籍的库存摘要:

sed 's/:/\t/g' cat BookDB.txt)

但它只是将所有行连接成两行,如下所示:

Title            Author          Price          Qty Avail         Qty Sold       Total Sales
---------------------------------------------------------------------------------------------------
Python for dummies Pauline 10.45 4 3 Python for dummies Peter 10.67 0 11 C++ for dummies Jared Loo 10.56 1 9
Python for dummies Pauline 10.45 4 3 Python for dummies Peter 10.67 0 11 C++ for dummies Jared Loo 10.56 1 9

基本上,我希望我的输出看起来像这样:

Title               Author                Price          Qty Avail.               Qty Sold
-------------------------------------------------------------------------------------------
Python for dummies  Pauline                10.45             4                       3
Python for dummies  Peter                  10.67             0                       11
C++ for dummies     Jared Loo              10.56             1                       9

除了修改上面列出的 sed 命令之外,还有其他更好的方法吗?

【问题讨论】:

    标签: bash awk sed grep delimiter


    【解决方案1】:

    BookDB.txt 的内容:

    Python for dummies:Pauline:10.45:4:3
    Python for dummies:Peter:10.67:0:11
    C++ for dummies:Jared Loo:10.56:1:9
    

    命令:

    column -ts : <(echo Title:Author:Price:Qty Avail.:Qty Sold) BookDB.txt | sed "1{p;s/./-/g}"
    

    输出:

    Title               Author     Price  Qty Avail.  Qty Sold
    ----------------------------------------------------------
    Python for dummies  Pauline    10.45  4           3
    Python for dummies  Peter      10.67  0           11
    C++ for dummies     Jared Loo  10.56  1           9
    

    【讨论】:

    • 赞成解决方案的简单和优雅。如果我想在标题和数据之间添加一条水平线怎么办?
    【解决方案2】:

    输入类似

    Title:Author:Price:Qty Avail.:Qty Sold
    Python for dummies:Pauline:10.45:4:3
    Python for dummies:Peter:10.67:0:11
    C++ for dummies:Jared Loo:10.56:1:9
    

    您可以将其格式化为

    column -t -s : your_file.txt
    

    输出:

    Title               Author     Price  Qty Avail.  Qty Sold
    Python for dummies  Pauline    10.45  4           3
    Python for dummies  Peter      10.67  0           11
    C++ for dummies     Jared Loo  10.56  1           9
    

    至于您的原始文档没有标题,您可以简单地做

    (echo 'Title:Author:Price:Qty Avail.:Qty Sold'; cat your_file.txt) | column -t -s :
    

    它会给出相同的输出。

    你也可以添加一个sed命令来插入水平线:

    < | sed '2s|^|---------------------------------------------------------------\n|'
    

    输出:

    Title               Author     Price  Qty Avail.  Qty Sold
    ---------------------------------------------------------------
    Python for dummies  Pauline    10.45  4           3
    Python for dummies  Peter      10.67  0           11
    C++ for dummies     Jared Loo  10.56  1           9
    

    与sed类似的是:

    ... | awk 'NR == 2 { print "-----..." } 1'
    
    ... | awk 'NR == 2 { $0 = "-----..." RS $0 } 1'
    
    ... | awk 'NR == 2 { $0 = "-----...\n" $0 } 1'
    

    【讨论】:

      【解决方案3】:

      我假设您已经从您的 sed 命令中遗漏了一些字符,并且实际上它看起来更像 sed 's/:/\t/g' &lt;&lt;&lt;$(cat BookDB.txt)(虽然这会很奇怪,但这是您发布的内容中编辑最少的版本得到的结果与您声称得到的结果相似)。

      如果你只使用sed 's/:/\t/g' BookDB.txt,它会起作用吗?

      【讨论】:

        猜你喜欢
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 2019-07-28
        • 2011-05-01
        • 1970-01-01
        • 2018-11-18
        相关资源
        最近更新 更多