除了最后一行,我想移动这些列,我不知道是否可以使用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
...
答案 0 :(得分:3)
似乎您只是想获取最后16个字符。
func_v1
我仔细查看了您的示例,发现它是$ 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
P.S:$ 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
包含NUL字节,但未在终端上显示。
答案 1 :(得分:2)
或者使用grep打印最后16个字符:
grep -Po '.{16}$' file
或
grep -o '.\{16\}$' file
-P
for perl正则表达式-o
仅用于匹配答案 2 :(得分:1)
只需删除前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
答案 3 :(得分:1)
似乎没有提到最简单的解决方案。
您真的只希望字符从第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
请注意,如注释中所述,可以使用sed来模拟cut:
▶ sed -E 's/.{51}//' FILE
另一种方法是使用AWK设置字段宽度,如果您有支持它的AWK版本,例如GNU AWK,nawk(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 。
答案 4 :(得分:1)
awk '{print " "$NF}' file
...
0|2011002136|1|V
EVITAMIENT
O|.|.|2011-03-17
09:50:00|B3W918
|1|2|99|OTROS|MO
TOKAR|.|.|.|G-16
UN
UNA
...
答案 5 :(得分:0)
如果您的数据位于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