在shell中添加字符到文件的结尾和开头

时间:2015-01-27 16:55:25

标签: bash shell csv awk sed

我有一堆大型矩阵需要重新格式化,理想情况下使用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或类似的东西?即将[添加到示例的开头并将]附加到示例的最后一行?

想象一下,我的.csv矩阵有几千列和一行。

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

只是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 - 打印]和换行符

答案 2 :(得分:2)

另一个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]]