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

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

$ cat file
1       2
3
1       2       3
1
2
3
$ awk -v w=3 -f script.awk file
1       2       3
1       2       3
1       2       3

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

Количество полей в выводе определяется значением w, которое передается в командной строке, как показано выше. Обратите внимание, что это количество полей , а не количество символов табуляции.

BEGIN { OFS = FS = "\t" }

function output_line () {
    # a function that outputs the nf elements in the array a
    # separated by OFS (tab) and terminated by ORS (newline)

    for (j = 1; j < nf; ++j)
        printf("%s%s", a[j], OFS)

    printf("%s%s", a[nf], ORS)
}

{
    # a:  an array of fields that we want to output together
    # nf: the length of that array

    # just add each field to the a array
    for (i = 1; i <= NF; ++i) {
        a[++nf] = $i

        # if enough has been read, output the collected data
        if (nf == w) {
            output_line()
            nf = 0
        }
    }
}

END {
    # output any data remaining in a
    if (nf > 0)
        output_line()
}

Это то же самое, что и

tr '\t' '\n' <file | paste - - -

для моего небольшого примера. В вашем случае вы можете использовать сценарий awkвыше с -v w=996или ввести команду tr+ pasteс 996 дефисами.

0
23.05.2020, 13:22
4 ответа
awk -F '\t' 'NR>1 && !seen[$1]++{print $2}' file_name.csv
  • NR>1ложно для первой строки, затем она пропускается.
  • !seen[$1]++равно 1 (или true)для первого значения поля, которое анализируется в первый раз. (дубликаты оцениваются как 0 или false).
  • print $2печатает второе поле, если оба условия выполнены.
3
18.03.2021, 23:33

Если вам нужны только первые два столбца, вы можете использовать:

awk -F '\t' '!seen[$1]++{print $2}' testfile
0
18.03.2021, 23:33

У Миллера есть групповой head, который позволяет вам брать первые n записей, соответствующих определенному значению столбца (, в данном случае n=1):

$ mlr --tsv head -g C1 -n 1 then cut -f C2 file.tsv
C2
3
4
5

Если вам не нужны заголовки столбцов, сохраните формат ввода tsv, но измените формат вывода на индексированный:

mlr --itsv --onidx head -g C1 -n 1 then cut -f C2 file.tsv
0
18.03.2021, 23:33

Версия без awk, использующая ваши sortиuniq

tail -n +2 file | sort -ugk2 | column -t -H 1

потерять заголовок, напечатав tailиз строки -nномер +2изfile

tail -n +2 file | 

sort-uник, использующий -gобщее числовое значение на -key2

sort -ugk2 | 

и вывод как columnar -tспособный, но -Hстолбец ide1

column -t -H 1
0
18.03.2021, 23:33

Теги

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