Em uma linguagem de alto nível, você usaria uma matriz de arrays, mas o bash não tem isso. Problemas que sugerem estruturas de dados multiníveis, como esta, tendem a ser muito tediosas para serem resolvidas no shell.
Mas como seu objetivo é aprender o processamento de texto Unix, e não o Python, vamos resolvê-lo no shell.
Nesta solução, lemos o arquivo uma vez para obter os cabeçalhos de linha e, novamente, quantas vezes forem necessárias para coletar o número necessário de elementos. Mantemos dois arrays: outrow
é uma matriz de linhas de saída com cada linha sendo anexada à medida que vamos; cursor
é uma matriz de inteiros que armazena nosso lugar em cada linha.
Observe que esse script fará um loop para sempre se não houver elementos suficientes para atender à solicitação. Resolvendo isso é deixado como um exercício para o leitor.
#!/bin/bash
k=$1
input=input.txt
declare -a outrow
declare -a cursor
K=0
n=0
while read line
do
outrow[$n]=${line%% *}
cursor[$n]=1
(( n++ ))
done < $input
while [[ $K -lt $k ]]
do
n=0
while read line
do
declare -a col=( $line )
if [[ ${#col[@]} -gt ${cursor[$n]} ]]
then
outrow[$n]+=" ${col[ ${cursor[$n]} ]}"
(( cursor[$n]++ ))
(( K++ ))
[[ $K -lt $k ]] || break
fi
(( n++ ))
done < $input
done
for row in "${outrow[@]}"
do
echo "$row"
done