Манипуляция csv файлом в unix - PullRequest
0 голосов
/ 25 мая 2018

У меня есть CSV-файл, подобный этому

"ID","NAME","TIME"
"858","abc","21:38:52"
"874","ghi","18:20:33"
"858","abc","19:38:52"
"978","def","21:38:52"
"874","ghi","13:20:33"
"319","ghi","13:24:50"
"319","ghi","22:29:16"

Некоторые записи одинаковы, за исключением того, что они различаются по времени (представлены в третьем столбце), и в основном я хочу только самые последние записи.Мне нужна команда, чтобы определить дубликаты записей и удалить записи со старыми временными метками, чтобы мой выходной файл выглядел следующим образом:

"ID","NAME","TIME"
"858","abc","21:38:52"
"978","def","21:38:52"
"874","ghi","18:20:33"
"319","ghi","22:29:16"

Ответы [ 3 ]

0 голосов
/ 25 мая 2018
$ tac file | awk -F, '!seen[$1]++' | tac
"ID","NAME","TIME"
"858","abc","21:38:52"
"978","def","21:38:52"
"874","ghi","13:20:33"
"319","ghi","22:29:16"
0 голосов
/ 31 мая 2018

Несколько ответов до сих пор неявно полагались на временные метки, уже упорядоченные / отсортированные в файле.Следующее не делает такого предположения:

#! /usr/bin/awk -f
BEGIN { FS = OFS = SUBSEP = "," }
FNR == 1 {
    split("", tt) # Time Text
    split("", ts) # Numeric Timestamp
    print
    next
}
{
    t = $3
    gsub(/[":]/, "", t)
    if ((($1, $2) in ts) && (ts[$1, $2] >= t))
        next
    ts[$1, $2] = t
    tt[$1, $2] = $3
}
END {
    for (x in tt)
        print x, tt[x]
}
0 голосов
/ 25 мая 2018

Не могли бы вы попытаться выполнить следующие действия: awk.

awk -F"," '!b[$1,$2]++{c[++count]=$1 OFS $2} {a[$1,$2]=$0} END{for(i=1;i<=count;i++){print a[c[i]]}}' SUBSEP=" " Input_file

Добавление формы решения, не относящейся к одному вкладышу, тоже сейчас.

awk -F"," '
!b[$1,$2]++           {  c[++count]=$1 OFS $2  }
                      {  a[$1,$2]=$0           }
END{
 for(i=1;i<=count;i++){ print a[c[i]]          }
}
' SUBSEP=" "  Input_file

Объяснение:

awk -F"," '
!b[$1,$2]++           {  c[++count]=$1 OFS $2  } ##Checking if array b whose index is $1,$2 value is NOT more than 1 if yes then create array c whose index is variable count(whose value is getting incremented each time cursor comes here) and its value is $1 OFS $2.
                      {  a[$1,$2]=$0           } ##Then creating an array named a whose index is $1,$2(first and second field of current line) and value is current line value.
END{                                             ##Starting END block of awk here.
 for(i=1;i<=count;i++){ print a[c[i]]          } ##Starting a for loop whose values starts from i=1 to till count value and printing array a value whose index is array c value, where array c index is variable i.
}
' SUBSEP=" " Input_file                          ##Setting SUBSEP as space for array and mentioning Input_file name here.
...