Подтвердить что ты не робот

Как подсчитать количество уникальных значений поля в текстовом файле с разделителями табуляции?

У меня есть текстовый файл с большим объемом данных, который ограничен табуляцией. Я хочу посмотреть данные, чтобы я мог видеть уникальные значения в столбце. Например,

Red     Ball 1 Sold
Blue    Bat  5 OnSale
............... 

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

Мне нужно сделать это в командной строке Linux, возможно, используя некоторые bash script, sed, awk или что-то еще.

Добавление: Спасибо всем за помощь, могу я попросить еще одну вещь? Что делать, если я хотел бы подсчитать эти уникальные значения?

Наверное, я не придавал второй части достаточно ясно. Я хотел бы сделать так, чтобы количество "каждого" этих уникальных значений не знало, сколько уникальных значений существует. Например, в первом столбце я хочу знать, сколько там объектов Red, Blue, Green и т.д.

4b9b3361

Ответ 1

Вы можете использовать команды cut, sort и uniq следующим образом:

cat input_file | cut -f 1 | sort | uniq

получает уникальные значения в поле 1, заменяя 1 на 2, вы получите уникальные значения в поле 2.

Избегайте UUOC:)

cut -f 1 input_file | sort | uniq

EDIT:

Чтобы подсчитать количество уникальных вхождений, вы можете использовать команду wc в цепочке как:

cut -f 1 input_file | sort | uniq | wc -l

Ответ 2

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

awk < test.txt '{print $1}' | sort | uniq

Как указано в другом месте, если вы хотите подсчитать количество экземпляров чего-то, вы можете перетащить уникальный список в wc -l

Ответ 3

cat test.csv | awk '{ a[$1]++ } END { for (n in a) print n, a[n] } '

Ответ 4

Предполагая, что файл данных фактически разделен Tab, а не выравнивается по пространству:

<test.tsv awk '{print $4}' | sort | uniq

Где $4 будет:

  • $1 - Красный
  • $2 - Ball
  • $3 - 1
  • $4 - Продано

Ответ 5

# COLUMN is integer column number
# INPUT_FILE is input file name

cut -f ${COLUMN} < ${INPUT_FILE} | sort -u | wc -l

Ответ 6

Вот bash script, который полностью отвечает (переработанному) оригинальному вопросу. То есть, учитывая любой файл .tsv, он предоставляет краткий обзор для каждого столбца по очереди. Помимо bash, он использует только стандартные инструменты * ix/Mac: sed tr wc cut sort uniq.

#!/bin/bash
# Syntax: $0 filename   
# The input is assumed to be a .tsv file

FILE="$1"

cols=$(sed -n 1p $FILE | tr -cd '\t' | wc -c)
cols=$((cols + 2 ))
i=0
for ((i=1; i < $cols; i++))
do
  echo Column $i ::
  cut -f $i < "$FILE" | sort | uniq -c
  echo
done

Ответ 7

Этот script выводит количество уникальных значений в каждом столбце данного файла. Предполагается, что первая строка данного файла является строкой заголовка. Нет необходимости определять количество полей. Просто сохраните script в файле bash (.sh) и предоставите файл с разделителями табуляции в качестве параметра для этого script.

код

#!/bin/bash

awk '
(NR==1){
    for(fi=1; fi<=NF; fi++)
        fname[fi]=$fi;
} 
(NR!=1){
    for(fi=1; fi<=NF; fi++) 
        arr[fname[fi]][$fi]++;
} 
END{
    for(fi=1; fi<=NF; fi++){
        out=fname[fi];
        for (item in arr[fname[fi]])
            out=out"\t"item"_"arr[fname[fi]][item];
        print(out);
    }
}
' $1

Пример выполнения:

bash> ./script.sh <path to tab-delimited file>

Пример вывода

isRef    A_15      C_42     G_24     T_18
isCar    YEA_10    NO_40    NA_50
isTv     FALSE_33  TRUE_66