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
我想从 制表符分隔的 文件中删除某些行并将输出写入新文件。
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