Распечатать все строки, которые имеют и не имеют пустых полей в отдельных файлах - PullRequest
0 голосов
/ 12 мая 2019

У меня есть файл .csv с col1, col2, col3, col4, и я хотел бы удалить те строки, которые не имеют никакого значения в col4.

col1 col2 col3 col4
----------------------
1,    xx,  yy,  zz,
2,    aa,  bb,    ,
3,    cc,  dd,  ee,
4,    ff,  gg,    ,
5,    hh,  ii,    ,

Я хочу, чтобы вы вернули 2 файла, один из которых:

col1 col2 col3 col4
---------------------
1,    xx,  yy,  zz,
3,    cc,  dd,  ee,

и другой:

col1 col2 col3 col4
---------------------
2,    aa,   bb,    ,
4,    ff,   gg,    ,
5,    hh,   ii,    ,

Можно было бы сделать это с помощью какого-либо инструмента, такого как awk, sed, grep ... Я не знаю, как выполнить часть печати строк с пустым столбцом 4 или NULL.

Ответы [ 3 ]

1 голос
/ 12 мая 2019

Это существенно исправлено после ошибок, обнаруженных Эдом Мортоном.

Вы можете легко сделать это, используя AWK:

awk -F' *, *' '
  $4 == "" {
    print > "FILE1.csv"
  }
  $4 != "" {
    print > "FILE2.csv"
  }
  ' FILE.csv

Пояснение:

  • -F устанавливает разделитель полей запятыми с пробелами 1 , необязательно с любой стороны.
  • Когда поле 4 пустое, выведите эти строки в FILE1.csv; и когда поле 4 не пустое, выведите эти строки в FILE2.csv.

Или, более кратко:

awk -F' *, *' '{print > ("FILE" ($4=="" ? 1 : 2) ".csv")}' FILE.csv

1 Обратите внимание, что некоторые спрашивают, есть ли у OP символ табуляции плюс запятая или пробел плюс запятая. Если файл содержит вкладки, он будет отображаться как:

1,  xx, yy, zz,
2,  aa, bb, ,
3,  cc, dd, ee,
4,  ff, gg, ,
5,  hh, ii, ,

Мне визуально ясно, что файл ОП разделен пробелами и разделен запятыми, а отрицательные голоса несправедливы.

1 голос
/ 12 мая 2019

Как показано, ваш файл данных не соответствует правилам CSV, потому что строка 1 не разделена запятыми.Если между запятыми есть пробелы, вам понадобится что-то более сложное, но если файл будет выглядеть примерно так:

1,xx,yy,zz,
2,aa,bb,,
3,cc,dd,ee,
4,ff,gg,,
5,hh,ii,,

Тогда эти строки будут разделены по мере необходимости:

awk -F, '{if(length($4)>0){print}}' col.csv

awk -F, '{if(length($4)==0){print}}' col.csv

Первый даст строки 1 и 3, а второй 2,4 и 5.

0 голосов
/ 12 мая 2019

Кроме того, вы можете использовать grep, чтобы сделать это:

Если вам нужно colx:

echo "col1 col2 col3 col4" > with.txt && echo "col1 col2 col3 col4" > without.txt

для извлечения данных и сохранения в два файла:

 grep -P "\w*?,\s*\w*?,\s*\w*?,\s*\w+," test.csv >> with.txt
 grep -P "\w*?,\s*\w*?,\s*\w*?,\s*," test.csv >> without.txt

обратите внимание, что использование > очищает файл, а затем записывает, а >> добавляет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...