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

Dat*_*ata 6 awk grep sed

我遇到了一个似乎无法解决的乏味问题,尽管搜索并尝试了一段时间,但我相信它非常简单。

我有一个文件:

$ 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
Run Code Online (Sandbox Code Playgroud)

我想匹配所有 *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
Run Code Online (Sandbox Code Playgroud)

我能够匹配模式,但问题是每个值都在一个新行上返回,这不是我想要的:

$ 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
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何完成并返回所需的输出?可能与tr?尽管我假设使用这种方法每行都会连接到一行,但又不是所需的输出。

kar*_*kfa 3

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
Run Code Online (Sandbox Code Playgroud)