У меня есть файл с разделителями вертикальной черты. У меня 28 полей. Мне нужно удалить последние 2 поля и напечатать только 26 полей

Это ответ--окно -position=0,0

В файле~/.xinitrc:

s@14march:~$ cat ~/.xinitrc
#!/bin/sh
xset -dpms
xset s off
xset s noblank

unclutter &
chromium http://google.pl/ --kiosk --window-position=0,0 --window-size=1280,1024 --start-fullscreen --incognito --noerrdialogs --disable-translate --no-first-run --fast --fast-start --disable-infobars --disable-features=TranslateUI --disk-cache-dir=/dev/null
s@14march:~$ 
-5
20.04.2020, 15:57
3 ответа

С любым POSIX -совместимым sed:

sed 's/\([^|]*|\)\{2\}$//'

напр.:

$ echo 'foo|DC||0|' | sed 's/\([^|]*|\)\{2\}$//'
foo|DC|
1
19.03.2021, 02:27
awk 'BEGIN{FS=OFS="|"} NF>2{NF-=2;$1=$1;print}'

С некоторыми (, но не со всеми! )варианты awk можно опустить $1=$1.

В случае, когда в строке менее 3 полей, строка вообще не печатается; это единственный способ убедиться, что есть разница между строкой с пустым начальным полем и строкой с менее чем 3 полями.

Когда поле -разделитель(FS)не является одиночным пробелом, каждое его совпадение будет разграничивать поля, а пустые начальные и конечные поля НЕ обрезаются.

В строке типа DC||0|4 поля (DC, <empty>, 0, <empty>), а не 3. Удаление последних 2 приведет к DC, <empty>=> DC|при соединении с |.

Аналогично, в строке типа |DC|есть 3 поля (<empty>, DC, <empty>), а не 1, и удаление последних 2 приведет к <empty>, т.е. пустой строке без каких-либо |.

0
19.03.2021, 02:27

Я использовал cut -d "|" -f 1-26 <filename>, и это сработало.

0
19.03.2021, 02:27

Теги

Похожие вопросы