Другой способ в одну строку:
while read line; do echo "$line" | awk '{print $1}' | tr '\n' ' '; echo "$line" | awk '{print $2}' | tr ',' '\n' | sort -u | tr '\n' ',' | sed -e 's/.$//g'; echo; done < file_to_sort
Берется первый столбец каждой строки (echo $line | awk '{print $1}' | tr '\n' ' ' ;
) и отсортируйте значения второго столбца, разделенные символом ',', после преобразования его в один столбец, чтобы применить sort
и затем преобразовав его обратно в одну строку с исходным форматированием (echo $line | awk '{print $2}' | tr ',' '\n' | sort -u | tr '\n' ','
).
Разбиение строк, как предложил @tripleee:
while IFS=$'\t' read first second; do printf "%s\t%s\n" "$first" "$(tr ',' '\n' <<<"$second" | sort | tr '\n' ',' | sed -e 's/.$//g';)"; done < file_to_sort