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

时间:2017-09-21 16:12:42

标签: linux awk sed cut

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

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个字段具有相同的值。

4 个答案:

答案 0 :(得分:1)

使用grep过滤:

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

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

答案 1 :(得分:1)

使用awk:

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

OFS:输出字段分隔符,默认为空格

答案 2 :(得分:1)

Sed解决方案:

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

这是:

  • -n - 不输出每一行
  • -r - 延长常规表现
  • /regexp/p - 包含正则表达式的打印行 regexp
  • ^ - 行开头
  • (regexp){3} - 重复regexp 3次
  • [^\t] - 除标签
  • 以外的任何字符
  • \t - 制表符
  • * - 多次重复字符
  • 2017-09-19 - 搜索文字

也就是说,跳过从行开头用制表符分隔的3列,然后检查第4列的值是否与所需的值一致。

答案 3 :(得分:0)

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

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