【发布时间】:2019-10-31 04:14:18
【问题描述】:
我有如下文件,只有几百行:
$ cat file1
TAP 1.0
.1.2.3.0 .0.3.2.1.1
.1.2.3.1 .1.3.2.1.1
.1.2.3.2 .2.3.2.1.1
.1.2.3.3 .3.3.2.1.1
.1.2.3.4 .4.3.2.1.1
.1.2.3.5 .5.3.2.1.1
TAP 1.0
.1.2.3.0 .0.3.2.1.2
.1.2.3.1 .1.3.2.1.2
.1.2.3.2 .2.3.2.1.2
.1.2.3.3 .3.3.2.1.2
.1.2.3.4 .4.3.2.1.2
.1.2.3.5 .5.3.2.1.2
TAP 1.0
.1.2.3.0 .0.3.2.1.3
.1.2.3.1 .1.3.2.1.3
.1.2.3.2 .2.3.2.1.3
.1.2.3.3 .3.3.2.1.3
.1.2.3.4 .4.3.2.1.3
.1.2.3.5 .5.3.2.1.3
.....
从上面的文件中,我只需要 grep 两个“.1.2.3.1”和“.1.2.3.0”并打印如下:
(( Desired Output))
.1.3.2.1.1 .0.3.2.1.1
.1.3.2.1.2 .0.3.2.1.2
.1.3.2.1.3 .0.3.2.1.3
....
我的代码仅适用于使用以下 awk grepping 特定字符串:
s1 输出如下,它为 .1.2.3.1 提供 grepping 并给出除第一列之外的所有列的输出,如下所示:
command: s1= cat $file1 | grep -i '.1.2.3.1' | awk '{$1=""; print $0}'
O/P(Output):
.1.3.2.1.1
.1.3.2.1.2
.1.3.2.1.3
s2 以同样的方式为 grepping .1.2.3.0 提供输出,如下所示:
command: s2= cat $file1 | grep '.1.2.3.0' | awk '{$1=""; print $0}'
O/P:
.0.3.2.1.1
.0.3.2.1.2
.0.3.2.1.3
所以当我同时运行时,s1 和 s2 的完整输出将如下所示(这不是我想要的):
s1= cat $file1 | grep -i '.1.2.3.1' | awk '{$1=""; print $0}'
s2= cat $file1 | grep '.1.2.3.0' | awk '{$1=""; print $0}'
O/P:
.1.3.2.1.1
.1.3.2.1.2
.1.3.2.1.3
.0.3.2.1.1
.0.3.2.1.2
.0.3.2.1.3
我需要如下输出,我如何打印我的上面如下:(应该如下)
Desired Output:
.1.3.2.1.1 .0.3.2.1.1
.1.3.2.1.2 .0.3.2.1.2
.1.3.2.1.3 .0.3.2.1.3
.. etc
输出本身应该是“echo $s1 $s2”格式,但是输出应该和上面一样,通过一次读取和打印一个变量S1和S2,而不是先打印所有S1,然后再打印所有的循环条件S2 grepped 输出。
所以我需要将每个读取变量暂时保存在 S1 和 S2 中,并按照上面的顺序一个接一个地打印。
所以上面的输出只有在脚本下面出现时才会出现:
- First grepped output of .1.2.3.1 should be kept in variable s1
- First grepped output of .1.2.3.0 should be kept in variable s2
then print both first grepped one's of both temporary string as echo $s1 $s2 as below:
.1.3.2.1.1 .0.3.2.1.1
- Do in the same way for second grepped temporary output for both as below:
.1.3.2.1.2 .0.3.2.1.2
- Do in the same way for all Nth grepped output as below:
.1.3.2.1.1 .0.3.2.1.1
.1.3.2.1.2 .0.3.2.1.2
....
.1.3.2.1.Nth .0.3.2.1.Nth
对于所有序列,它应该一次打印一个 grep,而不是所有 grep 输出。
至于您更好地理解,对于特定 grep 的一行效果更好,如下所示:
[root@server]$cat file0
.1.2.3.0 .0.3.2.1.1
.1.2.3.1 .1.3.2.1.1
.1.2.3.7 .3.3.2.1.1
[root@server]$ s1=`cat file0 | grep -i '.1.2.3.1' | awk '{$1=""; print $0}'`
[root@server]$ s2=`cat file0 | grep '.1.2.3.0' | awk '{$1=""; print $0}'`
host$ echo $s1 $s2
.1.3.2.1.1 .0.3.2.1.1
但是它对像“file0”这样的“file1”是如何工作的,我怎样才能像上面那样打印!!
谢谢!
【问题讨论】:
-
您是否忽略了输入文件中的第一个标记?另外,如果满足条件的记录不止一条怎么办?
-
我不知道您发布的输入和您发布的输出之间的映射是什么。希望其他人能够弄清楚,但您可能想为您的问题添加解释。
-
试试
sed 's/.*\(tap.*\)/.1.3.2.1.\1 .0.3.2.1.\1/;p;N;N;d' tap.file,然后考虑如何改进问题。 -
我修改了问题位,它用于更多记录(未修复)以及 tap 我提到只是为了了解序列如何进行,我的问题是如何阅读每个 grep s1 和 s2 并作为临时变量保存在内部并打印两者(如:echo $s1 $s2)。如果这有点清楚,请告诉我。
-
s1= cat $file与cat $file相同。grep -i '.1.2.3.1'与grep '.1.2.3.1'相同。cat $file | grep '.1.2.3.1'与grep '.1.2.3.1' $file相同。grep '.1.2.3.1' $file | awk '{$1=""; print $0}'与awk '/.1.2.3.1/{$1=""; print $0}'相同。这些都没有任何意义。s1和s2应该是什么?为什么没有一个输出匹配?