我想洗掉列之前的所有列label_port。不幸的是,它總是處于不同的位置。我正在尋找一種方法來計算label_port第一行之前的字符數,然后洗掉每行中的字符數。有人有想法嗎?
| log_port|local_port|label_port| mtu|
| 0x10100| 1| 7| 9122|
| 0x10500| 5| 8| 9122|
| log_port|local_port|slocal|label_port| mtu|
| 0x10100| 1| 0| 7| 9122|
| 0x10500| 5| 0| 8| 9122|
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -E '/\|label_port/h;G;:a;s/^.(.*\n).(.*\|label_port)/\1\2/;ta;s/\n.*//' file
復制包含|label_port.
將副本附加到每一行。
使用模式匹配,從每行的開頭洗掉字符,直到附加的行與其行的開頭匹配。
洗掉換行符和任何人工制品。
uj5u.com熱心網友回復:
$ awk 'NR==1{s=index($0,"|label_port")} {print substr($0,s)}' file
|label_port| mtu|
| 7| 9122|
| 8| 9122|
uj5u.com熱心網友回復:
基于 othersed的答案非常優雅,應該是首選。但由于它很棘手(并且為了完整性),這里有一個可能更容易理解的sed解決方案。
我們可以使用sed僅列印第一行,|label_port|...已洗掉,并通過管道將其wc用于計算要洗掉的前導字符數:
$ n=$(sed -En '1s/\|label_port\|.*//p' file | wc -m)
然后我們減去一,因為wc還計算sed添加到其輸出的最后一個換行符:
$ ((n-=1))
最后,我們n從所有行中去除前導字符:
$ sed -E "s/.{$n}//" file
|label_port| mtu|
| 7| 9122|
| 8| 9122|
最后兩個命令可以組合使用:
$ sed -E "s/.{$((n-1))}//" file
請注意,我們可以在一個awk程式中完成相同的操作:
$ awk 'NR==1{n=match($0,/\|label_port\|/)} {print substr($0,n)}' file
|label_port| mtu|
| 7| 9122|
| 8| 9122|
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368391.html
