Извлечение уникальных столбцов из файла в список через запятую с определенным порядком - PullRequest
0 голосов
/ 24 октября 2018

У меня есть файл .csv с этими значениями

product,0 0,no way
brand,0 0 0,detergent
product,0 0 1,sugar
negative,0 0 1, sight
positive, 0 0 1, salt

, и я хочу создать файл с разделенными запятыми строками в отсортированном порядке, за исключением того, что «отрицательный» всегда находится в конце.Поэтому я хочу, чтобы ["бренд", "положительный", "продукт", "отрицательный"]

Я не смог автоматизировать этот процесс, поэтому я сделал

  1. awk -F ',' '{print $1}' file.csv | sort | uniq -c > file2.txt

  2. awk '{if(NR>1) printf ", ";printf("\"%s\"",$0)} END {print ""}' file2.txt > file3.txt Я получаю "бренд", "негатив", "позитив", "продукт"

  3. Тогда явручную переместите «минус» в конец, а также добавьте [и] вперед и назад, чтобы получить

    ["brand","positive","product","negative"]
    

Есть ли способ сделать его более эффективным и автоматизировать процесс?

Ответы [ 5 ]

0 голосов
/ 24 октября 2018

Использование Perl с одной строкой

$ cat unique.txt
product,0 0,no way
brand,0 0 0,detergent
product,0 0 1,sugar
negative,0 0 1, sight
positive, 0 0 1, salt

$ perl -F, -lane ' { $x=$F[0];$x=~s/^(negative)/z\1/g;$rating{$x}++ } END {$q="\x22";$y=join("$q,$q",sort keys %rating) ; $y=~s/${q}z/$q/g; print "[$q$y$q]" }' unique.txt
["brand","positive","product","negative"]

$
0 голосов
/ 24 октября 2018

другое решение с понятными шагами

$ awk -F, '{print ($1=="negative"?1:0) "\t\"" $1 "\""}' file | # mark negatives
  sort | cut -f2 | uniq |                                      # sort, cut, uniq
  paste -sd, | sed 's/^/[/;s/$/]/'                             # serialize, add brackets


["brand","positive","product","negative"]
0 голосов
/ 24 октября 2018

Вот одна команда gnu awk, чтобы заставить ее работать:

awk -F, '{
   a[$1] = ($1 == "negative" ? "~" : "") $1
}
END {
   n = asort(a)
   printf "["
   for (i = 1; i <= n; i++) {
      sub(/^~/, "", a[i])
      printf "\"%s\"%s", a[i], (i < n ? ", " : "]\n")
   }
}' file.csv

["brand", "positive", "product", "negative"]
0 голосов
/ 24 октября 2018

Есть много способов подойти к этому.Вы действительно хотите получить результат в виде массива JSON с квадратными скобками и кавычками вокруг имен столбцов?Если это так, то jq, вероятно, является хорошим инструментом для его генерации.Примерно так все это будет делать как одна jq программа:

jq -csR '[split("\n")|
          map(select(length>0))[]|
          split(",")[0]]|
          sort_by(if .=="negative" then "zzzz" else . end)' file.csv

, которая выводит это:

["brand","positive","product","negative"]

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

cut -d, -f1 file.csv | 
  sed 's/negative/zzz&/' | 
  sort -u | 
  sed 's/zzz//' |
  paste -d, -s - 

Или вы можете слегка изменить команду jq, добавив флаг -r и еще одинтруба в конце:

jq -csrR '[split("\n")|
           map(select(length>0))[]|
           split(",")[0]]|
           sort_by(if .=="negative" then "zzzz" else . end)|
           join(",")' file.csv

Любой из которых выводит это:

brand,positive,product,negative
0 голосов
/ 24 октября 2018

Это сработало для меня:

cut -d, -f1 file.csv | sort -u | sed "/^negative/d" | tr '\n' ',' | sed -e 's/^/["/' -e 's/,/","/g' -e 's/$/negative"]/'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...