как сортировать скрипт по столбцам и удалять повторяющиеся

grep -oF ' " ' файл | wc -l

-F означает фиксированную струну

0
29.01.2021, 11:19
4 ответа

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

sort test.txt | uniq | awk '{if(col[$1])col[$1]=col[$1]" "$2; else col[$1]=$2;}; END{for (i in col) print i, col[i]}'

является test.txtвашим входным файлом.

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

5
18.03.2021, 22:33

Использованиеdatamash:

$ datamash -s -t ' ' -g 1 collapse 2 <file
0 2,9
1 2
12 34,134
2 3,7,9
306 237,3
7 9

Это считывает данные, разделенные пробелами -, сортирует их и сворачивает второй столбец в группы, заданные первым столбцом.

Чтобы заменить запятые пробелами, пропустите вывод черезtr, ' ':

$ datamash -s -t ' ' -g 1 collapse 2 <file | tr, ' '
0 2 9
1 2
12 34 134
2 3 7 9
306 237 3
7 9

Хотите отсортировать строки по номерам, пропустите их черезsort -n:

$ datamash -s -t ' ' -g 1 collapse 2 <file | tr, ' ' | sort -n
0 2 9
1 2
2 3 7 9
7 9
12 34 134
306 237 3

В качестве альтернативы сначала выполните числовую сортировку и удалите -sиз вызоваdatamash:

$ sort -n <file | datamash -t ' ' -g 1 collapse 2 | tr, ' '
0 2 9
1 2
2 3 7 9
7 9
12 134 34
306 237 3

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

$ sort -k 1,1n -k 2,2n <file | datamash -t ' ' -g 1 collapse 2 | tr, ' '
0 2 9
1 2
2 3 7 9
7 9
12 34 134
306 3 237

(Обратите внимание на разницу в последних двух строках вывода.)

3
18.03.2021, 22:33

С помощью awkвы можете сделать:

awk '{ found[$1]= (found[$1]? found[$1] FS $2: $2); };
END  { for (x in found) print x, found[x]; }' infile

объединить вторые столбцы, имеющие тот же первый столбец, и удерживать в связанном массиве, назовем его found, в ENDнапечатать первый столбец (, который мы использовали в качестве ключа массива и мы получим к ним доступ поkeyмы назовем, если x), затем их соединенные вторые столбцы (, доступные поarray_name[key])

3
18.03.2021, 22:33

Числовая сортировка файла по двум его полям и передача в GNU awk/sed для дальнейшей обработки, мы получаем желаемое o/p:

$ sort -n -k1 -k2 < file \
| awk '
    BEGIN { ORS = "" }
    prev != $1"" {
      if (NR>1) print RS
      print
      prev = $1
      next
    }{ print ORS, $2 }
    END { print RS }
' -

$ sort -n -k1 -k2 < file \
| sed -Ee '
  :a
  $!N
  /^(\S+)\s.*\n\1\s/s/\n\S+//
  ta
  P;D
'

Выход:

0 2 9
1 2
2 3 7 9
7 9
12 34 134
306 3 237
1
18.03.2021, 22:33

Теги

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