Linux - 如何根据字段值从文件中删除某些行

Linux - How to remove certain lines from a files based on a field value

我想从 制表符分隔的 文件中删除某些行并将输出写入新文件。

a   b   c   2017-09-20
a   b   c   2017-09-19
es  fda d   2017-09-20
es  fda d   2017-09-19

第 4 列是日期,基本上我只想保留第 4 列为“2017-09-19”的行(保留第 2 和 4 行)并写入新文件。新文件的格式应与原始文件的格式相同。

如何编写此示例的 linux 命令?

注意:搜索条件应该在第4个字段,因为我在真实数据中还有其他字段,可能与第4个字段具有相同的值。

使用grep筛选:

cat file.txt | grep '2017-09-19' > filtered_file.txt

这并不完美,因为字符串 2017-09-19 不需要出现在第 4 列中,但如果您的文件看起来像示例,它会起作用。

使用 awk:

awk 'BEGIN{OFS="\t"} =="2017-09-19"' file

OFS: output field separator, a space by default

Sed 解决方案:

sed -nr "/^([^\t]*\t){3}2017-09-19/p" input.txt >output.txt

这是:

  • -n - 不要输出每一行
  • -r - 扩展正则表达式
  • /regexp/p - 打印包含正则表达式的行 regexp
  • ^ - 行首
  • (regexp){3} - 重复正则表达式 3 次
  • [^\t] - 除制表符外的任何字符
  • \t - 制表符
  • * - 多次重复字符
  • 2017-09-19 - 搜索文本

即从行首跳过以制表符分隔的3列,然后检查第4列的值是否与要求的值一致。

awk '/2017-09-19/' file >newfile

cat newfile
a   b   c   2017-09-19
es  fda d   2017-09-19