删除文件中比给定日期更新的行

删除文件中比给定日期更新的行

我不知道如何删除比给定日期更新的行。这是文件内容的片段。

构建保存.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>标签,然后通过管道传输上述命令。

参考

https://unix.stackexchange.com/a/11323/47538

https://unix.stackexchange.com/a/83069/47538

答案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/

相关内容