我有文件“report.csv”。该报告是根据几个参数生成的
,范围从 1 到 10。因此,report.csv 首先打印了所有参数
,然后是主标题和数据。现在我需要
使用标题和数据处理该文件并排除所有参数。该文件如下所示:
para_1: abc
para_2: def
para_3: ghi
.
.
.
para_n: xyz
Customer_Name, Customer_Number, .....
Jon Doe,19923
Adam Plak,19985
.
.
.
我使用下面的命令来获取列标题的位置
这给了我这个位置
grep -n "Customer_Name" report.csv | cut -d : -f1
(比方说)13
。然后我使用此命令复制到另一个文件并使用新文件
sed '1,13d' report.csv >> report_test.csv
不过我需要让它变得动态,比如
$var1 = grep -n "Customer_Name" report.csv | cut -d : -f1
$var2 = d
sed '1,$var1$var2' report.csv >> report_test.csv
各位专家可以帮助在 Shell 脚本中实现这一点吗?
答案1
var1=`grep -n "Customer_Name" report.csv | cut -d : -f1`
var2='d'
sed "1,${var1}${var2}" report.csv >> report_test.csv
或者
var1=$(grep -n "Customer_Name" report.csv | cut -d : -f1)
var2='d'
sed "1,${var1}${var2}" report.csv >> report_test.csv
解释
我们这里需要的是命令替换
命令替换可以通过两种方式完成,一种是使用
- $(...)
- ``...``
命令替换的目的是评估放在反引号内的命令,并将其结果作为实际命令的参数提供。
两种命令替换方式的区别
旧式反引号 ` ` 处理反斜杠和嵌套的方式有点不同。新式 $() 将 ( ) 之间的所有内容解释为命令。新式 $() 适用于所有符合 POSIX 的 shell。
这些是更好地理解命令替换的好读物: