Обрезать конечные запятые из каждой строки на основе 1-го поля в файле с разделителями

Попробуйте изменить порядок файлов:

grep -v -f ex2.txt ex1.txt
> d
2
21.11.2018, 23:07
3 ответа

Подход AWK. Мы определяем функцию trunk для печати подстроки всей строки, от индекса 0 до длины индекса - n символов. Остальное - это просто сопоставление с образцом и вызов функции trunk с соответствующим количеством удаляемых символов.

Как один лайнер:

$ awk -F ',' 'function trunk(n){print substr($0,0,length($0)-n)}; $1==400{trunk(10)};$1==300{trunk(5)};$1==210{trunk(2)} ' input.txt 

Из сценария это будет примерно так:

#!/usr/bin/awk -f

BEGIN { FS="," };

function trunk(n){
    print substr($0,0,length($0)-n)
}; 

$1==400{ trunk(10)};
$1==300{trunk(5)};
$1==210{trunk(2)};

И вот оно в действии:

$ ./trunk_lines.awk input.txt                                                                                            
400,"100.00",,,,"31",,,,"510","410","0102","023",,,,,,,,,,,,,,,,,,,,
300,"110","1",,"2016-04-15",,,"52706","TESTFR1","100.00","1.00",,,"N",,,,
210,"6876262",,"23 Rue du Roule",,,"PARIS","DF","75001","FR",,,,,,,,,,,,,,,,
1
27.01.2020, 21:56

Учитывая, что конечные поля пусты (или если вы также хотите их удалить)

awk -F, -vOFS=, '$1=="400"{NF-=10} $1=="300"{NF-=5} $1=="210"{NF-=2} 1' file 

, или если вы хотите быть умным (что может быть и хорошо, и плохо)

awk -F, -vOFS=, 'BEGIN{x[400]=10;x[300]=5;x[210]=2} {NF-=x[$1]} 1' file
1
27.01.2020, 21:56

Sed может удовлетворить ваши требования. Это будет соответствовать желаемому началу строки, а затем удалит желаемое количество запятых из конца.

sed -e '/^400/ s/,\{10\}$//' -e '/^300/ s/,\{5\}$//' -e '/^210/ s/,\{2\}$//' 
3
27.01.2020, 21:56

Теги

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