Você pode usar awk
para isso:
awk -F',|, ' 'NR==FNR{a[$2]=$3} NR>FNR{$8=a[$8];print}' OFS=',' "$file2" "$file1"
Isso lê model-list.csv, armazenando todos os modelos e suas descrições em uma matriz indexada por string (por exemplo, a["Z800"] == "HP Z800 Workstation"
). Em seguida, ele lê os dados da lista, substituindo cada modelo pela string de descrição da matriz.
Explicação:
-
-F',|, '
- define o separador de campos usando um padrão regex, neste caso o separador de campos será uma vírgula única ou uma única vírgula e um único espaço. -
NR==FNR{a[$2]=$3}
- NR é uma variável interna awk que registra o número total de linhas lidas desde o início do programa. O FNR é similar, mas mantém o controle do número de linhas do arquivo atual que foram lidas. Portanto,NR==FNR
é um idioma do awk que significa "se este for o primeiro arquivo a ser lido", e a ação associada éa[$2]=$3
, que salva o valor do campo 3 no arraya
, com o índice de strings sendo definido para o valor do campo 2. -
NR>FNR{$8=a[$8];print}'
- semelhante ao anterior, mas desta vez opera somente em arquivos diferentes do primeiro a ser lido. Para cada linha, usamos o valor do campo 8 como o índice para procurar o valor na matriz e, em seguida, reatribuímos o campo 8 ao valor da matriz. Finalmente, toda a linha é impressa. -
OFS=',' "$file2" "$file1"
- define o separador do campo de saída para uma vírgula (o padrão é o espaço) e, em seguida, lê dois arquivos na ordem especificada.