awk - awk/sed如何删除除最后一个以外的列

我想移动除了最后一个的列,我不知道是否有办法用awk或sed或其他一些行命令


.. .


 00000000: 30327c30 30303131 36333132 567c317c 0|2011002136|1|V


 00000010: 44204149 56452045 4d415449 544e4549 IA DE EVITAMIENT


 00000020: 7c007c4f 30327c00 302d3131 37312d33 O|.|.|2011-03-17


 00000030: 3a393020 303a3035 33427c30 38313957 09:50:00|B3W918


 00000040: 327c317c 7c39397c 4f52544f 4f4d7c53 |1|2|99|OTROS|MO


 00000050: 414b4f54 7c007c52 7c007c00 36312d47 TOKAR|.|.|.|G-16


 00000060: 7c54527c 444e4f43 52494355 204e5520 |RT|CONDUCIR UN 


 00000070: 49484556 4f4c5543 524f5020 414e5520 VEHICULO POR UNA


. . .



我试过了但只删除了第一列


$ cat file | sed -E $'s/+/t/g' | cut -f2-



我想要这里结果最后一列


. . .


 0|2011002136|1|V


 IA DE EVITAMIENT


 O|.|.|2011-03-17


 09:50:00|B3W918


 |1|2|99|OTROS|MO


 TOKAR|.|.|.|G-16


 |RT|CONDUCIR UN 


 VEHICULO POR UNA


. . .



时间:

看起来你只是想得到最后 16个字符。


$ sed 's/.*(.{16})/1/' file


0|2011002136|1|V


IA DE EVITAMIENT


O|.|.|2011-03-17


 09:50:00|B3W918


|1|2|99|OTROS|MO


TOKAR|.|.|.|G-16


|RT|CONDUCIR UN


VEHICULO POR UNA



我仔细查看了你的示例,并发现它是由 xxd -e 生成的十六进制转储。 如果要获取原始文件,请使用以下命令:


$ xxd -r file | xxd -e | xxd -r> original_file


$ cat original_file


0|2011002136|1|VIA DE EVITAMIENTO|||2011-03-17 09:50:00|B3W918|1|2|99|OTROS|MOTOKAR||||G-16|RT|CONDUCIR UN VEHICULO POR UNA



P.S: original_file 包含NUL字节,但在终端上没有显示。

使用grep打印最终 16字符的替代方法:

grep -Po '.{16}$' file

或者

grep -o '.{16}$' file

  • 用于perl正则表达式的-P
  • 仅匹配的-o

只需删除第 5个空格分隔的字段。

使用 GNU sed:


$ sed -E 's/(s+S+){5}s+//' file


0|2011002136|1|V


IA DE EVITAMIENT


O|.|.|2011-03-17


09:50:00|B3W918


|1|2|99|OTROS|MO


TOKAR|.|.|.|G-16


|RT|CONDUCIR UN


VEHICULO POR UNA



使用任何 POSIX sed:


$ sed 's/([[:space:]]*[^[:space:]]*){5}[[:space:]]*//' file


0|2011002136|1|V


IA DE EVITAMIENT


O|.|.|2011-03-17


09:50:00|B3W918


|1|2|99|OTROS|MO


TOKAR|.|.|.|G-16


|RT|CONDUCIR UN


VEHICULO POR UNA



如果你的数据在 d 文件中,尝试过 gnu awk


awk -F' [a-f0-9]{8} ' '{print $2}' d



尝试使用 gnu sed


sed -E 's/.*s[a-f0-9]{8}s{2,}(.*)/1/' d



最简单的解决方案似乎没有提到。

你真的想让那些字符在第52位的位置开始。 所以使用cut :

输入:


▶ cat> FILE <<EOF


 00000000: 30327c30 30303131 36333132 567c317c 0|2011002136|1|V


 00000010: 44204149 56452045 4d415449 544e4549 IA DE EVITAMIENT


 00000020: 7c007c4f 30327c00 302d3131 37312d33 O|.|.|2011-03-17


 00000030: 3a393020 303a3035 33427c30 38313957 09:50:00|B3W918


 00000040: 327c317c 7c39397c 4f52544f 4f4d7c53 |1|2|99|OTROS|MO


 00000050: 414b4f54 7c007c52 7c007c00 36312d47 TOKAR|.|.|.|G-16


 00000060: 7c54527c 444e4f43 52494355 204e5520 |RT|CONDUCIR UN


 00000070: 49484556 4f4c5543 524f5020 414e5520 VEHICULO POR UNA


EOF



输出:


▶ cut -c52- FILE


0|2011002136|1|V


IA DE EVITAMIENT


O|.|.|2011-03-17


 09:50:00|B3W918


|1|2|99|OTROS|MO


TOKAR|.|.|.|G-16


|RT|CONDUCIR UN


VEHICULO POR UNA



另一种方法是使用AWK设置字段宽度,如果你有一个支持它的AWK版本如 GNU ( Mac OS X ) 等


▶ gawk 'BEGIN {FIELDWIDTHS ="15 9 9 9 9 16"} {print $6}' FILE


0|2011002136|1|V


IA DE EVITAMIENT


O|.|.|2011-03-17


 09:50:00|B3W918


|1|2|99|OTROS|MO


TOKAR|.|.|.|G-16


|RT|CONDUCIR UN


VEHICULO POR UNA



AWK解决方案的好处是,虽然需要更多的设置工作,但它会向代码的读者传达有关数据期望的更多信息。

要确定所有列的开始位置,可以在将光标定位到Vim上后使用 CTRL + g。

...