Вы можете использовать что-то вроде этого:
awk -v fl=<filed_list> 'BEGIN {
n = split(fl, t, " ")
for (i = 0; ++i <= n;)
fa[t[i]]
}
{
for (i = 0; ++i <= NF;)
if (!(i in fa))
printf "%s", ($i (i < NF ? OFS : ORS))
}'
Рассмотрим следующий ввод:
zsh-4.3.14[t]% paste -sd\; < <(printf '%s\n' {1..10})
1;2;3;4;5;6;7;8;9;10
Для удаления 3-го поля:
zsh-4.3.14[t]% paste -sd\; < <(printf '%s\n' {1..10}) |
pipe> awk -F\; -v fl=3 'BEGIN {
pipe quote> n = split(fl, t, " ")
pipe quote> for (i = 0; ++i <= n;)
pipe quote> fa[t[i]]
pipe quote> }
pipe quote> {
pipe quote> for (i = 0; ++i <= NF;)
pipe quote> if (!(i in fa))
pipe quote> printf "%s", ($i (i < NF ? OFS : ORS))
pipe quote> }' OFS=\;
1;2;4;5;6;7;8;9;10
Чтобы удалить набор полей:
zsh-4.3.14[t]% paste -sd\; < <(printf '%s\n' {1..10}) |
pipe> awk -F\; -v fl='7 4 3' 'BEGIN {
pipe quote> n = split(fl, t, " ")
pipe quote> for (i = 0; ++i <= n;)
pipe quote> fa[t[i]]
pipe quote> }
pipe quote> {
pipe quote> for (i = 0; ++i <= NF;)
pipe quote> if (!(i in fa))
pipe quote> printf "%s", ($i (i < NF ? OFS : ORS))
pipe quote> }' OFS=\;
1;2;5;6;8;9;10
Дайте мне знать, как должен выглядеть вывод, если вы удалите последнее поле (с или без конечного ФС).
Учтите, что с односимвольным разделителем полей и для простых задач cut может быть достаточно:
zsh-4.3.14[t]% paste -sd\; < <(printf '%s\n' {1..10}) | cut -d\; -f 1-2,4-
1;2;4;5;6;7;8;9;10
zsh-4.3.14[t]% paste -sd\; < <(printf '%s\n' {1..10}) | cut -d\; -f 1-2,5-6,8-
1;2;5;6;8;9;10
[Редактировать: следуя комментариям здесь]
Учитывая пример ввода:
3;03.2012;7228;0;1;3;1;3;4;3;1;3;4;3;2;0;4;4;1;1;4;2;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;1;1;3;0;3;1;3;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
3;03.2012;7229;0;2;2;0;5;5;4;4;5;5;4;4;2;5;5;0;0;3;3;0;0;5;6;0;0;0;0;0;2;2;1;2;1;2;2;2;4;3;4;1;5;4;2;0;0;0;0;0;0;0;0;0;0;4;4;4;4;4;0;0;0;0;0;0;0;
3;03.2012;7230;0;2;2;2;4;3;4;4;4;3;3;3;2;4;6;1;1;1;6;5;1;6;6;1;1;1;1;1;2;2;1;2;2;0;2;2;3;4;2;1;4;3;2;0;0;0;0;0;0;0;0;0;0;4;3;3;4;4;0;0;0;0;0;0;0;
3;03.2012;7231;0;1;3;1;4;4;3;3;4;4;4;4;2;5;5;1;1;4;6;5;1;4;1;1;1;1;1;5;2;1;1;2;0;0;1;2;4;4;3;1;4;3;2;0;0;0;0;0;0;0;0;0;0;4;4;4;4;3;0;0;0;0;0;0;0;
и следующий awk скрипт:
zsh-4.3.14[t]% cat s.awk
BEGIN {
n = split(fl, t, " ")
for (i = 0; ++i <= n;)
fa[t[i]]
}
{
for (i = 0; ++i <= NF;)
if (!(i in fa))
printf "%s", ($i (i < NF ? OFS : ORS))
}
С помощью этой команды:
zsh-4.3.14[t]% awk -F\; -v fl=3 -f s.awk OFS=\; infile > outfile
... Я получаю следующий вывод:
zsh-4.3.14[t]% cat outfile
3;03.2012;0;1;3;1;3;4;3;1;3;4;3;2;0;4;4;1;1;4;2;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;1;1;3;0;3;1;3;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
3;03.2012;0;2;2;0;5;5;4;4;5;5;4;4;2;5;5;0;0;3;3;0;0;5;6;0;0;0;0;0;2;2;1;2;1;2;2;2;4;3;4;1;5;4;2;0;0;0;0;0;0;0;0;0;0;4;4;4;4;4;0;0;0;0;0;0;0;
3;03.2012;0;2;2;2;4;3;4;4;4;3;3;3;2;4;6;1;1;1;6;5;1;6;6;1;1;1;1;1;2;2;1;2;2;0;2;2;3;4;2;1;4;3;2;0;0;0;0;0;0;0;0;0;0;4;3;3;4;4;0;0;0;0;0;0;0;
3;03.2012;0;1;3;1;4;4;3;3;4;4;4;4;2;5;5;1;1;4;6;5;1;4;1;1;1;1;1;5;2;1;1;2;0;0;1;2;4;4;3;1;4;3;2;0;0;0;0;0;0;0;0;0;0;4;4;4;4;3;0;0;0;0;0;0;0;
Если я правильно понимаю требование, вывод верен.
Для удаления полей с 1 по 5:
zsh-4.3.14[t]% awk -F\; -v fl='1 2 3 4 5' -f s.awk OFS=\; infile > outfile
zsh-4.3.14[t]% cat outfile
3;1;3;4;3;1;3;4;3;2;0;4;4;1;1;4;2;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;1;1;3;0;3;1;3;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
2;0;5;5;4;4;5;5;4;4;2;5;5;0;0;3;3;0;0;5;6;0;0;0;0;0;2;2;1;2;1;2;2;2;4;3;4;1;5;4;2;0;0;0;0;0;0;0;0;0;0;4;4;4;4;4;0;0;0;0;0;0;0;
2;2;4;3;4;4;4;3;3;3;2;4;6;1;1;1;6;5;1;6;6;1;1;1;1;1;2;2;1;2;2;0;2;2;3;4;2;1;4;3;2;0;0;0;0;0;0;0;0;0;0;4;3;3;4;4;0;0;0;0;0;0;0;
3;1;4;4;3;3;4;4;4;4;2;5;5;1;1;4;6;5;1;4;1;1;1;1;1;5;2;1;1;2;0;0;1;2;4;4;3;1;4;3;2;0;0;0;0;0;0;0;0;0;0;4;4;4;4;3;0;0;0;0;0;0;0;
Я что-то упустил?