Выбор строк в файле CSV на основе значения столбца, содержащего встроенную запятую

Проверьте, установлен лиSUNWgtar. Это версия GNU tar и предоставляет /usr/sfw/bin/gtar, что позволяет использовать опции GNU для tar.

0
30.01.2017, 12:20
4 ответа

Это может быть сделано с помощью awk , но это неудобно. :) Гораздо лучше сделать это с помощью настоящего парсера CSV, например csvkit :

csvgrep -c Comment -m 'too much, later' file.csv
2
28.01.2020, 02:16

Предполагается, что CSV правильно отформатирован:

Date,User,Email,Comment
11/22/16,aaaa,xxxxx@xxxxx.com,"too much, later"

Это работает, используя csvkit :

$ csvgrep -c Comment -m 'too much, later' data.csv
Date,User,Email,Comment
11/22/16,aaaa,xxxxx@xxxxx.com,"too much, later"

$ csvgrep -c 4 -m 'too much, later' data.csv
Date,User,Email,Comment
11/22/16,aaaa,xxxxx@xxxxx.com,"too much, later"

В качестве альтернативы, используя sed (поскольку мы знаем, что он находится в последнем столбце):

$ sed -n -e '1p' -e '/too much, later"$/p' data.csv
Date,User,Email,Comment
11/22/16,aaaa,xxxxx@xxxxx.com,"too much, later"

С данными, как показано в вопросе:

$ sed -n -e '1p' -e '/too much,later$/p' data.csv
Date,User,Email,Comment
11/22/16,aaaa,xxxxx@xxxxx.com,too much,later 
2
28.01.2020, 02:16
awk -F"," 'NF>4 { 
    b=$0; $1=$2=$3=""
    if (match($0,/too much, ?later/)) 
        print b
}' OFS="," input.csv > input1.csv
0
28.01.2020, 02:16

Я вижу простую проблему: строка слишком много, позже содержит , (запятая) и ваш разделитель полей также ,, поэтому параметр $4 будет слишком много и $5 будет позже.

Вы можете изменить свой код следующим образом:

awk -F , '$4 == "too much" && $5 == "later " { print }' input.csv > input1.csv

Обратите внимание, что это решение будет работать, только если последнее поле будет точно слишком много, позже (обратите внимание на завершающий пробел в строке).

Решение на основе regex является более надежным:

awk -F , '/,\s*too\s+much,\s*later\s*/{ print }' input.csv > input1.csv

В этом решении вы можете иметь любое количество символов пробела в строке.

2
28.01.2020, 02:16

Теги

Похожие вопросы