【问题标题】:Awk/sed add a column on conditionawk/sed 根据条件添加一列
【发布时间】:2016-11-29 12:37:44
【问题描述】:

我有一个包含 9 列的 csv 文件。有些行缺少第 4 列和第 5 列,这意味着这些行只有 7 列。我在使用此文件时遇到问题,因为它是其他一些应用程序。

有没有办法可以为有 7 列的行添加一个空列 4 和 5。

总共有 1960 行,其中 120 行有 7 列。

我试过了:

awk -F , 'NF==7' file1.csv

提取包含 7 列但不知道如何将其检查为条件的行,并在这些行的中间添加 2 个空列。

【问题讨论】:

  • 请提供minimal reproducible example 以及您目前尝试的方法
  • 多少行?
  • 120行7列,共1960行。
  • 我试过 awk -F , 'NF==7' file1.csv 提取有 7 列的行,但不知道如何检查它作为条件并在中间添加 2 个空列行。
  • edit你的帖子显示你在cmets中提到的所有这些信息

标签: shell awk sed


【解决方案1】:

OP 忘记发布的第一个缺失的测试材料:

$ cat > foo
1,2,3,4,5,6,7,8,9
1,2,3,6,7,8,9

然后,在 awk 中:

$ awk 'BEGIN { FS=OFS="," } 
       NF==7 { for(i=NF;i>=4;i--) $(i+2)=$i } 
# was: NF==7 { nf=NF; for(i=nf;i>=4;i--) $(i+2)=$i } 
       1' foo
1,2,3,4,5,6,7,8,9
1,2,3,6,7,6,7,8,9

请注意,原来的 $4$5 具有它们的原始值。这可以通过将$(i+2)=$i 更改为{ $(i+2)=$i; $i="" } 来改变。

【讨论】:

  • 为什么要用变量代替NF
  • 不确定是不是,但没时间测试,现在看可能还没有。
  • 据我所知,分配 to NF 不是一个好主意,但分配给 $NF 没有问题,因为它只是扩展到任何字段编号是。
  • @TomFenech 将 NF 设置为更高的值会在每个 POSIX 中添加空字段。使 NF 更小具有未定义的行为,因此一些 awk 将删除字段,一些将不做任何事情,而其他人可以做任何其他事情。添加字段只会导致 NF 自动更改。该变量不是必需的。
猜你喜欢
  • 2023-01-26
  • 2023-03-30
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 2019-12-22
  • 2021-08-16
相关资源
最近更新 更多