awk - 输出匹配模式,同时保留它们存在的行-bash

标签 awk sed grep

我遇到了一个似乎无法弄清的单调乏味的问题,尽管经过了一段时间的尝试,但我确信这很简单。
我有一个文件:

$ cat test.txt
shdh blah blah balg blah 0.44d 0.55d 0.33d
shdh blah blahdf fvalg blah 6.442d 1.515d 1.23d
3858 shdh blah blah balg blah 2.46d 9.35d 0.83d
shdh blah blah balg blah 4.46d
7 hh 4.5 5.34d 5.55d
t y 6.02d
88 2.7d
0.004d
shdh blah blah balg blah 0.96d 1.113d
6 yjryjh 423.99d 0.1d blah blah 0.9d 0.117d
我想匹配所有* d值,过滤掉其余的值,同时保留它们所在的行。
IE。要返回所需的输出,如下所示:
0.44d 0.55d 0.33d
6.442d 1.515d 1.23d
2.46d 9.35d 0.83d
4.46d
5.34d 5.55d
6.02d
2.7d
0.004d
0.96d 1.113d
423.99d 0.1d 0.9d 0.117d
我可以匹配模式,但是问题是每个值然后都在新行中返回,这不是我想要的:
$ cat test.txt | grep -Eo '[0-9]+\.[0-9]+d'
0.44d
0.55d
0.33d
6.442d
1.515d
1.23d
2.46d
9.35d
0.83d
4.46d
5.34d
5.55d
6.02d
2.7d
0.004d
0.96d
1.113d
423.99d
0.1d
0.9d
0.117d
是否有人对如何完成并返回所需的输出有任何想法?
可能与tr?尽管我假设使用此方法,然后每一行都将连接到一行,但又不是所需的输出。

最佳答案

awk进行救援!

$ awk '{for(i=1;i<=NF;i++) if($i~/d$/) printf "%s ",$i; print ""}' file

0.44d 0.55d 0.33d
6.442d 1.515d 1.23d
2.46d 9.35d 0.83d
4.46d
5.34d 5.55d
6.02d
2.7d
0.004d
0.96d 1.113d
423.99d 0.1d 0.9d 0.117d

关于awk - 输出匹配模式,同时保留它们存在的行-bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66090036/

相关文章:

c++ - 使用 C++ 字符串函数自动替换 s​​printf 函数

linux - grep --output-only 到单行

regex - 如何在 grep 中每个文件匹配一次?

linux - 识别不包含具有特定字符串的文件的文件夹

regex - 更改匹配行中的单词

shell - Unix shell 替换文件中包含反引号的单词

linux - 高级 GREP/AWK - 导出字符 > [X]

linux - 我可以使用 sed 来搜索字符串并追加/sub1 和一些文件 ../before search string

linux - 使用 AWK 查找列中的最小和最大数字?

awk - 使用 awk 查找大于或等于 0.021 到 0 的值