bash - ''|" 字符后的完整行以及上/下行的特定数据
问题描述
我有一个类似于下面的数据集。
我需要完成'|'之后的每一行 在此特定行之前/之后的行的值相同,其中“|”之前的值 与实际线路相符。
如果这可以用 bash/shell 脚本或 excel 来完成,我将不胜感激。
10166_101|
10166_101|50
10296_5|
10296_5|50
10484_5|20
10484_5|
10692_7|
10692_7|10
10742_102|
10742_102|100
10742_102|
10767_13|
10767_13|30
10793_9|
10793_9|50
10863_8|40
10863_8|
10887_3|
10887_3|40
10929_2|24
11004_2|10
11151_5|
11151_5|20
11212_21|80
11447_6|30
11486_9|
11486_9|80
11510_105|20
11510_105|
11610_3|
11610_3|10
11635_7|20
11635_7|
所以数据看起来像这样:
10166_101|50
10166_101|50
10296_5|50
10296_5|50
10484_5|20
10484_5|20
10692_7|10
10692_7|10
10742_102|100
10742_102|100
10742_102|100
10767_13|30
10767_13|30
10793_9|50
10793_9|50
10863_8|40
10863_8|40
10887_3|40
10887_3|40
10929_2|24
11004_2|10
11151_5|20
11151_5|20
11212_21|80
11447_6|30
11486_9|80
11486_9|80
11510_105|20
11510_105|20
11610_3|10
11610_3|10
11635_7|20
11635_7|20
解决方案
#!/bin/sh
sort --reverse inputfile > /tmp/reversedinput
awk -F\| '$0=="" {next}
$2!="" {line=$0;print line}
$2=="" {print line;}' /tmp/reversedinput > /tmp/reversedoutput
sort /tmp/reversedoutput > outputfile
它是如何工作的?
这对您的反向排序inputfile
,使其变为/tmp/reversedinput
:
11635_7|20
11635_7|
11610_3|10
11610_3|
11510_105|20
11510_105|
...
现在,逐行读取文件(从顶部开始),如果当前迭代中的行在管道字符之后没有任何内容,只需将其替换为上面的行。这就是awk
片段正在做的事情。所以你得到/tmp/reversedoutput
.
最后,只需按正确的顺序将其重新排序,即可得到outputfile
.
推荐阅读
- opayo - 使用 Direct 协议 v4.00 时的 IPv6 处理
- android - 为什么我生成的数据绑定类会为我的复合视图抛出 ClassCastException?
- go - 从完成通道和未关闭通道的 GC 生成 context.Context
- css - 悬停时引导菜单链接下的下划线显示不正确?
- java - IRC 自动响应机器人没有响应
- r - 将数据框转换为维恩图表
- html - 链接应该下降,而不是正确
- api - 如何在 JMeter 中对更新端点进行性能测试,同时自动更新有效负载中的行值
- java - Java 可执行文件安装后会随机变慢
- mysql - Spring Boot & Hibernate:带有本地 h2 和 Flyway 的 MySQL TEXT