【问题标题】:bash delete line conditionbash删除行条件
【发布时间】:2014-06-08 15:15:09
【问题描述】:

我找不到使用 bash 有条件地删除文件中的行的解决方案。该文件包含字符串中的年份日期,并且仅当年份低于参考值时才应删除相应的行。

文件如下所示:

'zg_Amon_MPI-ESM-LR_historical_r1i1p1_196001-196912.nc' 'MD5'
'zg_Amon_MPI-ESM-LR_historical_r1i1p1_197001-197912.nc' 'MD5'
'zg_Amon_MPI-ESM-LR_historical_r1i1p1_198001-198912.nc' 'MD5'
'zg_Amon_MPI-ESM-LR_historical_r1i1p1_199001-199912.nc' 'MD5' 
'zg_Amon_MPI-ESM-LR_historical_r1i1p1_200001-200512.nc' 'MD5'

我想从第 1 行获取 1969 年并将其与参考(比如 1980 年)进行比较,如果年份低于参考,则删除整行。这意味着在这种情况下,代码应该删除文件的前两行。

我尝试使用 sed 和 grep,但无法正常工作。

提前感谢您的任何想法。

【问题讨论】:

    标签: bash unix sed grep


    【解决方案1】:

    你可以使用awk:

    awk -F- '$4 > 198000 {print}' filename
    

    这将输出第二个日期晚于 1979 年 12 月 31 日的所有行。这不会就地编辑文件,您必须将输出保存到另一个文件,然后将其移动到原始文件的位置:

    awk -F- '$4 > 198000 {print}' filename > tmp && mv tmp filename
    

    使用sed(将就地编辑):

    sed -i '/.*19[0-7][0-9]..\.nc/d' filename
    

    这需要更多的思考,因为您需要构造一个正则表达式来匹配您不想显示的任何值。

    【讨论】:

      【解决方案2】:

      大概是这样的:

      awk -F- '{ if (substr($4,1,4) >= 1980) print }' input.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-17
        • 2015-03-19
        • 2015-10-13
        • 1970-01-01
        • 2014-03-29
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        相关资源
        最近更新 更多