Удаление выбора столбца в AWK
Я хотел бы удалить выбор столбцов из списка файлов CSV. Вызов awk является встроенным, так как он используется в сценарии оболочки. Я не знаю заранее, сколько столбцов у файлов, только то, что столбцы, которые я хочу удалить, включены в каждый файл списка.
Допустим, я хочу удалить первые 4 столбца. Вычистка значений столбца оставит разделители, которые я также хочу удалить.
Я думал, что сработало бы следующее: создать массив номеров столбцов для удаления и воссоздать соответствующую строку без этих столбцов.
Приведенное ниже значение длины (строки) соответствует ожидаемому, но последний цикл все еще выполняет итерацию по исходному количеству столбцов, а не по фактическому значению длины (строки).
голова $ f | awk 'BEGIN {FS = ","; split ("1,2,3,4", dropers, ",")} {split ($ 0, row, FS); для (i в dropers) удалить строку [i] ; print NF "," length (row) "<<<"; out = ""; print NF "," length (row) ">>>"; for (i = 1; i <= length (row); i ++) {print row [i] "lulu"; out = out "," row [i]}; sub (/ [\ t] * $ /, "", out); распечатать} '> $ g
или отформатированный:
head $f | awk 'BEGIN{FS=",";split("1,2,3,4",dropers,",")}{split($0,row,FS);for(i in dropers) delete row[i]; print NF "," length(row) "<<<";out=""; print NF "," length(row) ">>>";for(i=1;i<=length(row);i++){print row[i] "lulu"; out = out "," row[i]}; sub(/[ \t]*$/,"",out);print out}' > $g
Вот вывод для 2 файлов: идет 6 столбцов, 2 осталось, когда я удалил столбцы с 1 по 4, но цикл перебирает все 6 столбцов, а не ожидаемый 2. Спасибо за любой совет.
Aust.
6,2<<<
6,2>>>
lulu
lulu
lulu
lulu
0000009lulu
461474lulu
,,,,,0000009,461474
6,2<<<
6,2>>>
lulu
lulu
lulu
lulu
0000010lulu
94942lulu
,,,,,0000010,94942
редактировать (Велизарий)
Форматированный код выглядит следующим образом:
BEGIN {FS=",";
split("1,2,3,4",dropers,",")
}
{ split($0,row,FS);
for(i in dropers) delete row[i];
print NF "," length(row) "<<<";
out="";
print NF "," length(row) ">>>";
for(i=1;i<=length(row);i++){print row[i] "lulu";
out = out "," row[i]};
sub(/[ \t]*$/,"",out);
print out
}