Предполагая, что у вас одинаковое количество места в столбцах 1 и 3, вы можете использовать
awk -F '|' -v OFS='|' '$1==$3 { for(i = 3; i < NF-1; i++) $i = $(i+2); NF -= 2 } { print }' sample.txt
Пояснение:
-F '|' -v OFS='|'
установить разделители полей ввода и вывода $1 == $3
условие :столбцы 1 и 3 равны for(i = 3; i < NF-1; i++) $i = $(i+2);
начиная со столбца 3, переместить значения на 2 столбца вперед NF -= 2
уменьшить количество столбцов { print }
безусловно напечатать строку
Обратите внимание, что скрипт не удаляет столбцы 3 и 4 из заголовка, поскольку ID
не равно id
.
Как упоминал Стив, размер файла редко имеет значение на символьном устройстве.
Таким образом, решение просто открыть, прочитать, сделать. Какова вообще цель ftell здесь? Если вы хотите выделить буфер заранее, ответ таков: вы не можете.
Я предлагаю вам попробовать, что ваша программа делает с /dev/tty
. Может быть, сначала подумайте, что, как вы ожидаете, произойдет или должно произойти.
Еще один момент заключается в том, что в системах Unix все файлы являются двоичными, поэтому режим rb
не обязателен. В таких системах, как Windows, это имеет значение, но маловероятно, что /dev/usb
вообще существует в Windows.