我需要使用 shell 脚本处理文件。该文件附带数据以及一些与其处理方式相关的嵌入信息。该文件采用以下格式;
- 电子邮件地址
- 系统区域
- 项目编号
- 项目编号
- 项目编号
- 项目编号
- 等等 ...
email_address 需要通知用户提交文件已完成,而 system_area 则指示加载过程应加载文件的位置。因此,我将这两个值放入变量中以便在脚本中使用。我目前正在使用 3 个 sed 命令来获取信息,然后删除这些行;
var1=$(sed -n '1p' infile)
var2=$(sed -n '2p' infile)
sed -i '1,2d' infile
上面的代码可以工作,但我觉得它“笨拙”并且可能效率低下。有谁知道一种方法可以更优雅/更有效地实现相同的目标?
答案1
你的代码很好,我可能会这样做作为一个快速的解决方案。在打印后立即退出 sed 会更有效:sed -n '1{p;q}'
避免无缘无故地读取整个文件。
现在最尴尬的部分是读取文件两次以获得前两行。您可以简单地使用 shell 内置命令:
{ read -r var1; read -r var2; } < infile
然后保留sed -i '1,2d'
或简单地使用tail -n +3 > outfile; mv outfile infile
.
在一次传递中执行此操作的最终方法是读取两个变量,read
然后捕获其余变量:
{ read -r var1; read -r var2; cat; } < infile > outfile
请注意,我将输出保存到另一个文件中(然后您可以将其复制回来)。这不像使用 的就地修改那样“优雅” sed
,但它更安全,并且编写的代码量相同。最后一个版本也只读取文件一次,而不是三次。
答案2
在我看来,var1
并且var2
会获得相同的价值。
我会用
var1=$(awk 'NR==1' infile)
var2=$(awk 'NR==2' infile)
sed -i '1,2d' infile
在哪里
NR
是一个 awk 变量,表示记录数,即行号。NR==1
选择第 1 行- 默认 awk 操作是打印整行