【问题标题】:Adding character just to end and beginning of file in shell将字符添加到 shell 中文件的结尾和开头
【发布时间】:2015-01-27 16:55:24
【问题描述】:

我有一堆大型矩阵需要重新格式化,最好使用 shell。

假设我将此内容存储在 example.csv 中:

1,2,3
2,3,4
5,6,7

那我做

cat example.csv | tr ',' ' ' | awk '{print "["$0"]"}'

得到

[1 2 3]
[2 3 4]
[5 6 7] 

但我需要我的最终格式看起来像这样

[[1 2 3]
 [2 3 4]
 [5 6 7]]

那么我如何使用 shell 来完成此操作,例如sed、awk 或类似的东西? IE。将[ 附加到示例的开头并将] 附加到示例的最后一行?

假设我的 .csv 矩阵有数千列和数千行。

【问题讨论】:

  • 前导空格有多重要?

标签: regex bash shell awk sed


【解决方案1】:

以防万一您对sed 解决方案感兴趣

$ sed '1 s/^/[/; s/.*/[&]/; $ s/$/]/; s/,/ /g' input
[[1 2 3]
[2 3 4]
[5 6 7]]

【讨论】:

    【解决方案2】:

    只要 awk 就可以处理:

    awk -F, 'BEGIN{printf "["} NR>1{print ""} {$1=$1; printf "[%s]", $0} 
           END {print "]"}' example.csv
    [[1 2 3]
    [2 3 4]
    [5 6 7]]
    
    • BEGIN - 打印 [ 不带换行符
    • -F, 使用逗号作为字段分隔符
    • $1=$1 更改一些内容以告诉 awk 使用 OFS 以不同方式格式化输出(默认为空格)
    • NR>{print ""} - 从第 2 条记录开始打印换行符
    • END - 打印 ] 和换行符

    【讨论】:

      【解决方案3】:

      另一个awk(读取文件两次)

      awk -F, 'FNR==NR {a=NR;next}
               FNR==1 {$0="["$0} FNR==a {$0=$0"]"}
               {$1=$1;$0="["$0"]";print}' example.csv{,}
      [[1 2 3]
      [2 3 4]
      [5 6 7]]
      

      【讨论】:

        猜你喜欢
        • 2011-10-29
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        相关资源
        最近更新 更多