首页 > 解决方案 > ''|" 字符后的完整行以及上/下行的特定数据

问题描述

我有一个类似于下面的数据集。

我需要完成'|'之后的每一行 在此特定行之前/之后的行的值相同,其中“|”之前的值 与实际线路相符。

如果这可以用 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 

标签: bashshelldataset

解决方案


#!/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.


推荐阅读