Удаление выбора столбца в AWK - PullRequest
1 голос
/ 08 октября 2011

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

1 Ответ

1 голос
/ 08 октября 2011
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 in row){print row[i] "lulu"; 
                out = out "," row[i]}; 
  out = substr(out,2)
  sub(/[ \t]*$/,"",out);
  print out
}

с вводом:

a,b,c,d,e,f,g

отпечатки:

7,3<<<
7,3>>>
elulu
flulu
glulu
e,f,g
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...