从文件中复制前 2 行,然后删除这些行

从文件中复制前 2 行,然后删除这些行

我需要使用 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 操作是打印整行

相关内容