如何删除除最后一列以外的列?

时间:2019-04-24 21:29:21

标签: 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
    ...

6 个答案:

答案 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