Как подсчитать количество уникальных значений поля в текстовом файле с разделителями табуляции?
У меня есть текстовый файл с большим объемом данных, который ограничен табуляцией. Я хочу посмотреть данные, чтобы я мог видеть уникальные значения в столбце. Например,
Red Ball 1 Sold
Blue Bat 5 OnSale
...............
Итак, его, как и первый столбец, имеет цвета, поэтому я хочу знать, сколько разных уникальных значений есть в этом столбце, и я хочу иметь возможность сделать это для каждого столбца.
Мне нужно сделать это в командной строке Linux, возможно, используя некоторые bash script, sed, awk или что-то еще.
Добавление: Спасибо всем за помощь, могу я попросить еще одну вещь? Что делать, если я хотел бы подсчитать эти уникальные значения?
Наверное, я не придавал второй части достаточно ясно. Я хотел бы сделать так, чтобы количество "каждого" этих уникальных значений не знало, сколько уникальных значений существует. Например, в первом столбце я хочу знать, сколько там объектов Red, Blue, Green и т.д.
Ответы
Ответ 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