Bash 脚本 - 通过向前看删除行



>我有一个csv文件,其中有些行的第一个字段为空,而有些行在第一个字段中具有内容。第一个字段中包含内容的行是标题行。

我想删除所有不必要的标题行。我能看到的最好的方法是删除以下每一行:

  1. 第一个字段不为空
  2. 下一行中的第一个字段不为空

我不一定需要将数据保存在同一个文件中,所以我可以看到使用 grep、awk 或 sed 可以实现这一点,但我的所有尝试都没有接近工作。

示例输入:

header1,value1,etc
,value2,etc
header2,value3,etc
header3,value4,etc
,value5,etc

期望输出:

header1,value1,etc
,value2,etc
header3,value4,etc
,value5,etc

由于header2行后面没有空字段 1 的行,因此它是不必要的标题行。

awk -F, '$1{h=$0;next}h{print h;h=""}1' file

-F,:使用逗号作为字段分隔符

$1{h=$0;next} :如果第一个字段有数据(0 除外),则保存该行并继续下一行。

h{print h;h=""}1 :如果有保存的标题行,请打印并忘记它。(由于上述next,这只能在 $1 中没有任何内容时执行。

1:打印当前行。

通过反转文件并检查前一行是否为标题,这些类型的任务在概念上通常更容易:

tac file |
  awk -F, '$1 && have_header {next} {print; have_header = length($1)}' |
  tac

相关内容

  • 没有找到相关文章

最新更新