【发布时间】: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。话虽如此,我不明白你为什么要这样做,但我相信如果你说逻辑的话,可能会有更短的方法来做你所做的事情