Dado
A.csv:
1,2,V,4
B.csv:
X,Y,Z,3
Então
paste -d, <(cut -d, -f1,2 A.csv) <(cut -d, -f4 B.csv) <(cut -d, -f4 A.csv)
1,2,3,4
Eu tenho dois arquivos csv, digamos A e B. Eu percebi que eu acidentalmente misturei as coisas e agora, a fim de desfazer o erro que eu quero escrever um script de shell de tal forma que os dados na terceira coluna do arquivo A para ser escrito na quarta coluna do arquivo B e dados na quarta coluna arquivo B para ser escrito na terceira coluna do arquivo A. Eu sei que o comando "cut" pode ser usado para buscar dados de colunas específicas, mas eu não sei qual comando usar para escrever em um arquivo csv após um determinado número de ocorrências do delimitador em uma única linha.
Como escrever um roteiro assim?
Dado
A.csv:
1,2,V,4
B.csv:
X,Y,Z,3
Então
paste -d, <(cut -d, -f1,2 A.csv) <(cut -d, -f4 B.csv) <(cut -d, -f4 A.csv)
1,2,3,4
awk
é seu amigo
Faça uma cópia de fileA
para dizer fileA.bak
& fileB
para dizer fileB.bak
:
#first changing fileB
awk -v FS="," 'NR==FNR{fileA[i++]=$3;next}{$4=fileA[j++];print}' fileA.bak fileB.bak > fileB
#fileB should be Okay now.
#now changing fileA
awk -v FS="," 'NR==FNR{fileB[i++]=$4;next}{$3=fileA[j++];print}' fileB.bak fileA.bak > fileA
#fileA should be Okay now.
#verify that you have the desired contents in both fileA & fileB
#Now delete the backup files
rm fileA.bak fileB.bak
Notas
1. É possível combinar os scripts awk
, mas porque dividi-los torna as coisas mais claras e legíveis.
2. Essa solução pressupõe que você tenha o mesmo número de registros em fileA
e fileB
, conforme entendido na pergunta.
Tags text-processing csv