Отфильтруйте файл .CSV на основе 5-го значения столбца файла и распечатайте эти записи в новый файл

У меня есть файл .CSV с нижеследующим форматом:

"column 1","column 2","column 3","column 4","column 5","column 6","column 7","column 8","column 9","column 10 "12310","42324564756","a simple string with a , comma","string with or, without commas","string 1","USD","12","70%","08/01/2013","" "23455","12312255564","string, with, multiple, commas","string with or, without commas","string 2","USD","433","70%","07/15/2013","" "23525","74535243123","string , with commas, and - hypens and: semicolans","string with or, without commas","string 1","CAND","744","70%","05/06/2013","" "46476","15467534544","lengthy string, with commas, multiple: colans","string with or, without commas","string 2","CAND","388","70%","09/21/2013","" 

5-й столбец файла имеет разные строки. Мне нужно отфильтровать файл на основе значения 5-го столбца. Допустим, мне нужен новый файл из текущего файла, который имеет записи только со значением «строка 1» в своем пятом поле.

Для этого я попробовал команду ниже,

awk -F"," ' { if toupper($5) == "STRING 1") PRINT }' file1.csv > file2.csv

но это порождало ошибку:

 awk: { if toupper($5) == "STRING 1") PRINT } awk: ^ syntax error awk: { if toupper($5) == "STRING 1") PRINT } awk: ^ syntax error 

Затем я использовал следующее, которое дает мне нечетный вывод.

awk -F"," '$5="string 1" {print}' file1.csv > file2.csv

Вывод:

 "column 1" "column 2" "column 3" "column 4" string 1 "column 6" "column 7" "column 8" "column 9" "column 10 "12310" "42324564756" "a simple string with a comma" string 1 without commas" "string 1" "USD" "12" "70%" "08/01/2013" "" "23455" "12312255564" "string with string 1 commas" "string with or without commas" "string 2" "USD" "433" "70%" "07/15/2013" "" "23525" "74535243123" "string with commas string 1 "string with or without commas" "string 1" "CAND" "744" "70%" "05/06/2013" "" "46476" "15467534544" "lengthy string with commas string 1 "string with or without commas" "string 2" "CAND" "388" "70%" "09/21/2013" "" 

PS: Я использовал команду toupper, чтобы быть в безопасности, поскольку я не уверен, будет ли строка в более низком или более высоком случае. Также, пожалуйста, сообщите, что не так с моим кодом, и если пространство в строке имеет значение при поиске шаблона с использованием AWK.

3 Solutions collect form web for “Отфильтруйте файл .CSV на основе 5-го значения столбца файла и распечатайте эти записи в новый файл”

 awk -F '","' 'BEGIN {OFS=","} { if (toupper($5) == "STRING 1") print }' file1.csv > file2.csv 

Вывод

 "12310","42324564756","a simple string with a , comma","string with or, without commas","string 1","USD","12","70%","08/01/2013","" "23525","74535243123","string , with commas, and - hypens and: semicolans","string with or, without commas","string 1","CAND","744","70%","05/06/2013","" 

Я думаю, что это то, чего ты хочешь.

Проблема с CSV заключается в том, что нет стандарта. Если вам нужно часто обращаться с данными в формате CSV, вам может понадобиться более надежный метод, а не просто использовать "," качестве разделителя полей. В этом случае модули Perl Text::CSV CPAN исключительно хорошо подходят для работы:

 $ perl -mText::CSV_XS -WlanE ' BEGIN {our $csv = Text::CSV_XS->new;} $csv->parse($_); my @fields = $csv->fields(); print if $fields[4] =~ /string 1/i; ' file1.csv "12310","42324564756","a simple string with a , comma","string with or, without commas","string 1","USD","12","70%","08/01/2013","" "23525","74535243123","string , with commas, and - hypens and: semicolans","string with or, without commas","string 1","CAND","744","70%","05/06/2013","" 
 awk 'BEGIN {FS = "," }' '{ (if toupper($5) == "STRING 1") print; }' file1.csv > file2.csv 
  • Как использовать SED или AWK для замены заполнителей в файле шаблона с содержимым переменной, содержащим специальные символы?
  • Подсчитайте число 0 и 1 в файле
  • Сопоставьте целое слово (IP-адрес) с помощью `sed`
  • Как вставить переменную в переменную в случайном месте?
  • Замена шаблонов
  • sed - как печатать текстовый блок со второго шаблона?
  • Как эффективно разделить большой текстовый файл без разделения многострочных записей?
  • вставить новую строку, когда отрицательный + положительный шаблон найден с помощью sed
  • Объединение нескольких файлов с общим заголовком
  • Как найти значение из выражения
  • sed - как удалить все строки, которые не совпадают
  • Linux и Unix - лучшая ОС в мире.