Как всегда с такими вопросами, было бы лучше исправить процесс, который создает данные, в первую очередь, а не добавлять к процессу стадию постобработки -. Сказав это, вот что вы можете сделать.
$ 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 дефисами.
awk -F '\t' 'NR>1 && !seen[$1]++{print $2}' file_name.csv
NR>1
ложно для первой строки, затем она пропускается. !seen[$1]++
равно 1 (или true)для первого значения поля, которое анализируется в первый раз. (дубликаты оцениваются как 0 или false). print $2
печатает второе поле, если оба условия выполнены. Если вам нужны только первые два столбца, вы можете использовать:
awk -F '\t' '!seen[$1]++{print $2}' testfile
У Миллера есть групповой 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
Версия без awk
, использующая ваши sort
иuniq
tail -n +2 file | sort -ugk2 | column -t -H 1
потерять заголовок, напечатав tail
из строки -n
номер +2
изfile
tail -n +2 file |
sort
-u
ник, использующий -g
общее числовое значение на -k
ey2
sort -ugk2 |
и вывод как column
ar -t
способный, но -H
столбец ide1
column -t -H 1