我不知道如何删除比给定日期更新的行。这是文件内容的片段。
构建保存.txt
647919 2013/11/30
647946 2013/11/30
647955 2013/12/01
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04
我想删除比 2013/12/03 新的行,只留下
647919 2013/11/30
647946 2013/11/30
647955 2013/12/01
如何通过 bash 来完成此操作?
答案1
这些日期按字典顺序和时间顺序排序相同,因此只需进行词汇比较即可:
awk '$2 < "2013/12/03"'
答案2
如果您的系统包含该命令的 GNU 版本date
,您可以使用它将日期字段(在删除尾随 后<br>
,如果存在)转换为 Seconds-Since-epoch 并直接与相同格式的截止日期进行比较,例如在 bash 中
testsecs=$(date +%s --date="2013/12/03")
while IFS= read -r line; do
read -r x d <<< "$line"
if (( $(date +%s --date="${d%<br>}") < $testsecs )); then
printf '%s\n' "$line"
fi
done < buildsave.txt
[请注意,这不会执行就地删除 - 您需要将结果保存到临时文件并重命名。]
答案3
我认为<br>
您在专栏末尾的问题中的内容date
是不需要的。无论如何,如果存在的话,可以轻松将其删除。然而,来到主要部分,您可以使用以下方法来实现您想要做的事情:
sort -k 2n filename.txt
现在,上面的命令将以排序的方式给出输出。现在,以下命令应该给出您要查找的内容。
sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}'
解释
排序命令基本上根据第二列(即日期)对文件进行排序。因此,我修改了您的输入文件来测试该命令是否有效,因为输入文件默认对所有数据进行了排序。之后,该awk
命令将打印所有行,直到遇到特定的匹配项。
测试
cat filename.txt
647919 2014/01/01
647946 2012/11/30
647955 2011/01/04
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04
现在,sort -k 2n filename.txt
输出是,
647955 2011/01/04
647946 2012/11/30
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04
647919 2014/01/01
现在我们对文件排序在第二列感到满意。现在,选择值取决于特定日期,
sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}'
在上面的例子中,我得到了所有的值2013/12/03
。输出是,
647955 2011/01/04
647946 2012/11/30
不,这<br>
是我的文件的一部分
如果是这种情况,我们可以稍微调整命令,如下所示。
awk '{print $1, substr($2, 1, length($2)-4)}' filename.txt |
sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}'
所以我只是从第二列中删除所有<br>
标签,然后通过管道传输上述命令。
参考
答案4
针对您给出的一个日期的快速而肮脏的解决方案,只需使用 sed 删除所有匹配晚于该日期的日期的行即可:
sed -i "" "#[0-9]* 2013/12/0[4-9]#d" testfile.txt
sed -i "" "#[0-9]* 2013/12/[123][0-9]#d" testfile.txt
sed -i "" "#[0-9]* 2014/[0-9][0-9]/[0-3][0-9]#d" testfile.txt
-i "" 直接替换文件内部而不创建备份,但您也可以在不使用 -i "" 的情况下通过所有 3 个 sed 命令管道 testfile。
根据您的系统(Linux 或 Mac),您可以省略 -i 之后的“”,有时您需要正则表达式的 -e 参数。一定要尝试一下对你有用的方法。
有关 sed 的更多信息的相关问题:https://stackoverflow.com/questions/5410757/