Я хочу удалить выбранные столбцы из списка файлов 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
}