打印行不包含句号linux

时间:2017-11-28 20:04:12

标签: linux awk grep

我有一个包含数千行的文件。我想打印不包含句点的行。

awk '{print$2}' file.txt | head

我用它来打印我感兴趣的列,第2列(该文件只有两列)。 我已经删除了头部然后

awk '{print$2}' file.txt | grep -v "." | head

但是我只得到空行而不是任何预期的实际值,我认为它包含行之间的空格但我不确定。

是否有替代命令?

正如吉姆所说,我做了 -

awk '{print$2}' file.txt | grep -v "\." | head

然而,线的数量比以前更大,这是预期的吗?另外,我的输出是一个数字列表,但它们之间有空格(垂直),这是正常的吗?

下面的file.txt示例 -

120.4 3
270.3 7.9
400.8 3.9

200.2 4
100.2 8.7
300.2 3.4

102.3 6
49.0 2.3
38.0 1.2

因此预期(和正确)输出将是3行,因为第2列中有3个值没有句点:

$ awk '{print$2}' file.txt | grep -v "\." | head
3
4
6

但是,当运行上面的代码时,我得到5,这也是我想的行之间的空格:

$ awk '{print$2}' file.txt | grep -v "\." | head
3

4 

6

3 个答案:

答案 0 :(得分:1)

如果您已经在使用grep

,则很少需要使用awk

这将在第二列不包含点的每一行打印第二列:

awk '$2 !~ /\./ {print $2}'

但是你也想跳过空行,或者第二列不为空的行。所以也只是测试一下:

awk '$2 != "" && $2 !~ /\./ {print $2}'

(更有趣的版本是awk '$2 ~ /./ && $2 !~ /\./ {print $2}'

正如你所说,grep -v "."只给你空行。这是因为点表示“任何字符”,而-v表示打印的唯一行是那些不包含任何字符的行。

答案 1 :(得分:0)

grep将点解释为正则表达式元字符(点将匹配任何单个字符)。尝试使用反斜杠转义它:

awk '{print$2}' file.txt | grep -v "\." | head

答案 2 :(得分:0)

如果我理解得很好,你可以试试这个sed

sed ':A;N;${s/.*/&\n/};/\n$/!bA;s/\n/ /g;s/\([^ ]*\.[^ ]* \)//g' file.txt

output
3 
4 
6 
相关问题