【问题标题】:Why does the sed command skip some lines in bash?为什么 sed 命令会跳过 bash 中的某些行?
【发布时间】:2019-10-10 18:53:58
【问题描述】:

我有一个csv 文件,其顶部如下所示:

s_m_title
,,
7988114_lig2
7988114_lig2
7988114_lig3
7988114_lig2
7982570_lig2
7982570_lig2
9081391_lig2
9081391_lig2
6555615_lig
7988114_lig2

我想删除不以数字开头的每一行。然后我运行了这个sed 命令,将包含数字的每一行打印到一个新的csv 文件中。

sed -n -e '/1/{p;n;}' -e '/2/{p;n;}' -e '/3/{p;n;}' -e '/4/{p;n;}' -e '/5/{p;n;}' -e '/6/{p;n;}' -e '/7/{p;n;}' -e '/8/{p;n;}' -e '/9/{p;n;}' test_all.csv > improved2.csv

新的csv 文件的顶部如下所示:

7988114_lig2
7988114_lig2
7988114_lig3
7988114_lig2
7982570_lig2
7982570_lig2
9081391_lig2
9081391_lig2
7988114_lig2

sed 命令正确删除了s_m_title,, 行,但它也删除了6555615_lig 行。为什么?

我发现如果我将这作为两个命令执行,

sed '/,,/d' test_all.csv > improved3.csv

sed '/s_m_title/d' improved3.csv > improved2.csv

我得到了正确的输出,而没有删除任何编号的行。那么为什么sed 的这种用法会删除一些编号的行呢?

【问题讨论】:

  • 因为要打印第一行您需要 /s_m_title/{n;p}1p/s_m_title/p ,所以您的正则表达式都不匹配 s_m_title。话虽如此,我不明白你为什么要这样做,但我相信如果你说逻辑的话,可能会有更短的方法来做你所做的事情

标签: bash csv sed


【解决方案1】:

如果你只是想回显以数字开头的行,你可以使用这个:

sed -n '/^[0-9]/p' test_all.csv

或者只是 grep:

grep '^[0-9]' test_all.csv

您在 sed 中看到的行为是由于您在执行命令时使用了n 命令(移动到下一行输入)引起的。

  1. Sed 读取您输入的第一行 [s_m_title],没有匹配的命令,因此它不回显(因为 -n 选项)并移至下一行文本。

  2. 它读取第二行 [,,]。同上。

  3. 它读取第三行 [7988114_lig2],它与您的第一个命令 [/1/] 的模式匹配,因此它通过打印该行并移至输入的下一行 [7988114_lig2] 来执行该命令,但它保留在您的命令列表中的当前位置。所以现在它将新的输入行与第二个命令 [/2/]... 的模式进行比较。

碰巧当它读取带有 6555615_lig 的行时,它已经深入到您的命令列表中,超过了 /6/ 模式。并且由于该行无法匹配任何剩余的命令 [/7/、/8/ 和 /9/],sed 到达命令的末尾,不回显该输入行,获取下一行输入 [7988114_lig2] ,然后从第一个命令重新开始。

【讨论】:

  • 当以字符或特殊符号开头的行中存在数字时,此命令是否有效?
  • 最初我认为原始海报想要包含数字的行,但我已经更新了我的答案,只保留 以数字开头的行
【解决方案2】:

它只打印那些以 0-9 之间的任何数字开头的行

sed '/^[0-9]/!d' filename.csv

【讨论】:

    【解决方案3】:

    我相信您想打印任何包含 1、2、3、4、5、6、7、8 或 9 的行。在这种情况下:

    sed -n '/[1-9]/p' test_all.csv 
    

    或者:

    sed '/[1-9]/!d' test_all.csv
    

    或者,要打印所有除了前两行,使用:

    sed '1,2d' test_all.csv
    

    或者:

    sed -n '3,$p' test_all.csv
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多