Если в качестве разделителя всегда используется один символ (поэтому два или более последовательных разделителей обозначают пустые поля), вы можете headпросто указать первую строку в вашем входном файле, сосчитать разделители ( nразделители означают количество полей n+1), а затем использовать cutдля печати из 1поля st. до nполя th (от второго до последнего), например, с вводом, разделенным табуляцией:
n=$(head -n 1 infile | tr -dc \\t | tr \\t \\n | wc -l)
cut -f1-$n infile > outfile
или, например, с помощью файла CSV :
n=$(head -n 1 infile | tr -dc , | tr , \\n | wc -l)
cut -d, -f1-$n infile > outfile
Я проведу несколько тестов позже, если у меня будет время, но с огромным вкладом я думаю, что это решение должно быть быстрее, чем другие решения, использующие регулярное выражение, так как это делает минимальную обработку в первой строке, чтобы получить нет. полей, а затем использует cutкоторый оптимизирован для этой работы.