Эти ответы не требуют сортировки входных данных:
Храните count и last-line-seen в массивах. Требует много памяти для больших файлов и требует GNU awk
gawk '
{count[$1]++; line[$1]=$0}
END {
PROCINFO["sorted_in"]="@val_str_asc"
for (key in line) if (count[key] == 1) print line[key]
}
' file
Сканируйте файл дважды, сначала для получения количества, затем для печати строк с количеством 1
awk 'NR == FNR {count[$1]++; next} count[$1]==1' file file
Это будет быстрее всего и потребует меньше памяти, используя преимущества отсортированного ввода:
awk '
prev_key && prev_key != $1 {if (count==1) print prev_line; count=0}
{prev_key=$1; prev_line=$0; count++}
END {if (count==1) print prev_line}
' file
Использованиеawk
:
awk '{print substr($18,1,12)}' input
Это напечатает символы 1 -12 столбца 18. Это предполагает, что ваш текстовый файл разделен пробелами. Что, скорее всего, не так.
Для CSV:
awk -F, '{print substr($18,1,12)}' input
На основе комментария Steeldriver о добавлении этого вывода в новый столбец:
awk '{$(NF+1) = substr($18,1,12)} 1' input > output
К сожалению, при этом создается новый файл. gawk
может изменить файл на месте, но лучше всего создать новый файл, а затем удалить старый.