grep:保留某些列中具有特定字符串的行

use*_*715 4 awk grep sed

我试图找出某些列中具有特定值的行并将其保存到输出中.我试图用grep这样做.可能吗?

我的数据如下所示:

apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf
melon   1   ewtedf   wersdf
orange  3   qqqwetr  hredfg
Run Code Online (Sandbox Code Playgroud)

我想在第二列中挑选出值为5的行并将其保存到新的outputfile中.

apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf
Run Code Online (Sandbox Code Playgroud)

我很感激你的帮助!

Mic*_*ald 7

这可能是可能的,grep但绝对可以使用足够的工具来执行此操作awk.您可以过滤第二列上每行5的行

awk '$2 == 5'
Run Code Online (Sandbox Code Playgroud)

说明

awk将其输入分为记录(通常是一行)和字段(通常是一列),并对符合特定条件的记录执行操作.这里

awk '$2 == 5'
Run Code Online (Sandbox Code Playgroud)

是一个简短的表格

awk '$2 == 5 {print($0)}'
Run Code Online (Sandbox Code Playgroud)

转化为

For each record, if the second field ($2) is 5, print the full record ($0).
Run Code Online (Sandbox Code Playgroud)

变化

如果您需要动态选择用于过滤值的键值,请使用以下-v选项awk:

awk -v "key=5" '$2 == key {print($0)}'
Run Code Online (Sandbox Code Playgroud)

如果您需要保留文件的第一行,因为它包含表的标题,请使用NR跟踪当前记录的序号的变量:

awk 'NR == 1 || $2 == 5'
Run Code Online (Sandbox Code Playgroud)

字段分隔符是一个正则表达式定义哪些文本分开的列,它可以与被修改-F字段.例如,如果您的数据位于基本CSV文件中,则过滤器将是

awk -F", *" '$2 == 5'
Run Code Online (Sandbox Code Playgroud)

访问标签wiki,找到一些有用的信息来开始学习awk.


Dav*_*ica -2

简单的方法是:

grep '5' MyDataFile
Run Code Online (Sandbox Code Playgroud)

结果:

apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf
Run Code Online (Sandbox Code Playgroud)

要将其捕获到新文件中:

grep '5' MyDataFile > newfile
Run Code Online (Sandbox Code Playgroud)

注意:这将在 MyDataFile 中的任何位置找到 5。为了限制第二列,一个简短的脚本就可以满足您的需求。如果您只想将其限制为第二列,则可以使用如下所示的快速脚本。用法:script number datafile

#!/bin/bash

while read -r fruit num stuff || [ -n "$stuff" ]; do
    [ "$num" -eq "$1" ] && printf "%s  %s  %s\n" "$fruit" "$num" "$stuff"
done <"$2"
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./fruit.sh 5 dat/mydata.dat

apple  5  abcdefd  ewdsf
peach  5  ewtdsfe  wtesdf
Run Code Online (Sandbox Code Playgroud)