bash删除行条件

时间:2014-04-23 16:29:15

标签: bash unix sed grep

我找不到使用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,但无法使其正常工作。

提前感谢任何想法。

2 个答案:

答案 0 :(得分:2)

您可以使用awk

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

这将输出第二个日期晚于31/12/1979的所有行。这不会就地编辑文件,你必须将输出保存到另一个文件,然后移动它来代替原始文件:

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

使用sed(将就地编辑):

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

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

答案 1 :(得分:1)

也许是这样的:

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