Удалить кавычки "..." из всех столбцов с помощью AWK - PullRequest
0 голосов
/ 30 октября 2019

В настоящее время я пытаюсь создать скрипт awk, который возьмет мой .csv и преобразует его в .tsv. Мне удалось добиться этого с помощью следующего скрипта:

$ awk 'BEGIN { FS=","; OFS="\t" } {$1=$1; print}' file.csv > file.tsv

Пример данных CSV

"visitor_date","country","browser","browser_version","id1","id2","id3","id4","true or false column"
"05/10/2019 00:55","United States","App","","692467","2163702","4117512086","format","0"
"05/10/2019 00:56","United States","SamsungBrowser","8","692467","2163702","4117512083","format","1"
"05/10/2019 01:08","United States","safari","11","692467","2163704","4117511299","format","1"
"05/10/2019 03:25","United States","SamsungBrowser","8","692467","2163704","4117511299","format",""
"05/10/2019 07:50","United States","chrome","58","692467","2163704","4117511299","format",""
"05/10/2019 09:18","United States","internet explorer","11","692467","2163702","4117512086","format","0"

Однако я обнаружил, что мой файл данных имеет тенденцию иметь все столбцы, определенные какжало с "", даже когда у нас есть вещи, которые можно считать целым числом.

Мой первоначальный тест состоял в том, чтобы попытаться удалить {","} из всего, а затем определить вещи как строки в определенных столбцах, но я получаю сообщение об ошибке, когда пытаюсь процитировать его.

$ awk 'BEGIN { FS="",""; OFS="\t" } {$1=$1; print}' file.csv > file.tsv

Ошибка

awk: cmd. line:1: BEGIN { FS="",""; OFS="\t" } {$1=$1; print}
awk: cmd. line:1:              ^ syntax error

Из проведенного в Интернете исследования все, что я обнаружил, - это то, как вы можете изменить строковое значение в ячейке на другое целочисленное значение. Есть ли способ, которым я могу преобразовать определенные столбцы (не ячейки), чтобы обрабатывать их как "целые числа" и "даты", а не как строки? Является ли то, что я пытаюсь сделать с моим первоначальным тестом, верным ли мне направлением, или AWK по-другому определяет мои столбцы?

Желаемый вывод tsv

"visitor_date"  "country    browser"    "browser_version"   "client_transaction_id" "id1"   "id2"   "id3"   "id4"   "true or false column"
05/10/2019 00:55    "United States" "App"       null    692467  "2163702"   4117512086  "format"    0
05/10/2019 00:56    "United States" "SamsungBrowser"    8   "null"  692467  2163702 4117512083  "format"    1
05/10/2019 01:08    "United States" "safari"    11  null    "692467"    2163704 4117511299  "format"    1
05/10/2019 03:25    "United States" "SamsungBrowser"    8   "null"  692467  2163704 4117511299  "format"    
05/10/2019 07:50    "United States" "chrome"    58  null    "692467"    2163704 4117511299  "format"    
05/10/2019 09:18    "United States" "internet explorer" 11  "null"  692467  2163702 4117512086  "format"    0

Примечание: столбец "visitor_date" должен быть в формате "date".

Извинения, если это что-то супер очевидное или основное. В настоящее время у меня есть только 2-дневный опыт использования интерфейса Ubuntu в Windows 10 и AWK, поэтому я пытаюсь многое понять.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Если нет двойных кавычек, которые вы хотите сохранить, просто

awk 'BEGIN { FS=","; OFS="\t" } { gsub("\"", "") } { $1=$1 } 1' file.csv >file.tsv

Кстати, это также демонстрирует, как заключить в кавычки буквенный символ двойной кавычки внутри строки в двойных кавычках;backslash-escape it.

Если вы хотите удалить только двойные кавычки вокруг некоторых столбцов, вы можете ограничить область действия gsub. Например,

... { gsub("\"", "", $1); gsub("\"", "", $3) } 1

для манипулирования только столбцами 1 и 3. Затем вы можете отбросить { $1 = $1 }, потому что мы все равно заставляем Awk пересчитать его столбцы (поэтому FS заменяется на OFS).

Чтобы не манипулировать первой строкой (которая обычно содержит заголовок, а не данные), добавьте условие:

... NR>1 { gsub(...) }1

«Заменить везде» можно выразить довольно кратко в sed, хотя, как правило, это больше язык только для записи.

sed -e 's/,/\t/g' -e 's/"//g' file.csv >file.tsv

Не все диалекты sed интерпретируют \t как буквальную табуляцию, а некоторые даже имеют аллергию на множественные -eпараметры;но это должно хорошо работать в Ubuntu и в целом в Linux (кроме, возможно, Busybox и других подобных попыток пережить ограничения веселых 1970-х).

0 голосов
/ 31 октября 2019

Это не awk, но с Миллером это очень просто (https://github.com/johnkerl/miller). Бег

mlr --c2t cat ./input.csv >./output.csv

У вас будет

visitor_date    country browser browser_version id1 id2 id3 id4 true or false column
05/10/2019 00:55    United States   App     692467  2163702 4117512086  format  0
05/10/2019 00:56    United States   SamsungBrowser  8   692467  2163702 4117512083  format  1
05/10/2019 01:08    United States   safari  11  692467  2163704 4117511299  format  1
05/10/2019 03:25    United States   SamsungBrowser  8   692467  2163704 4117511299  format  
05/10/2019 07:50    United States   chrome  58  692467  2163704 4117511299  format  
05/10/2019 09:18    United States   internet explorer   11  692467  2163702 4117512086  format  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...