Tenho que mesclar centenas de arquivos .txt lado a lado. Tenho tentado usar algumas das perguntas já respondidas nos fóruns, mas enquanto os arquivos são mesclados, o segundo e o terceiro (e assim por diante) arquivos mudam uma linha para baixo a cada vez. Gostaria que eles ficassem alinhados, todos os arquivos tivessem o mesmo número de linhas (se não caracteres em cada linha). Meus arquivos são separados por vírgulas e meu objetivo final é fazer com que todos se destaquem no processamento de dados.
meus arquivos são
591.txt
CT Analyser, Version: 1.9.3.2
Date and time,25.07.2014 09:56
Operator identity,svy557
Computer name,UT156805
Computation time,00:08:24
Dataset,591_right__rec_tra_voi
Location,D:\Pam Mandible Copy\591\Right\Region1\
583.txt
CT Analyser, Version: 1.9.3.2
Date and time,31.07.2014 15:14
Operator identity,svy557
Computer name,UT156805
Computation time,00:10:04
Dataset,583_left__rec_tra
Location,D:\Pam Mandible Copy\583 Left\Reoriented\
Eu tentei algo como o seguinte:
paste 591.txt 593.txt | column -s $'\t' -t
ele se funde assim (o segundo arquivo uma linha abaixo, em vez de linhas próximas umas das outras):
CT Analyser, Version: 1.9.3.2
CT Analyser, Version: 1.9.3.2
Date and time,25.07.2014 09:56
Date and time,25.07.2014 09:55
Operator identity,svy557
Operator identity,svy557
Computer name,UT156805
Computer name,UT156805
Computation time,00:08:24
Computation time,00:08:13
Dataset,591_right__rec_tra_voi
Dataset,583_right__rec_tra_voi
Location,D:\Pam Mandible Copy\591 Right\Region1\
Location,D:\Pam Mandible Copy\583 Right\Region1\
Isso está ficando louco há alguns dias e qualquer ajuda seria muito apreciada. Sou muito novo no UNIX, então estou tentando aprender o suficiente para fazer isso e outros projetos que exigem habilidades semelhantes. Os arquivos reais têm cerca de 50 linhas e todos ficam assim, se eu tentar fazer mais de um arquivo com algo assim:
paste -d '\n' *.txt > new.txt
Os resultados tornam-se imprevisíveis
CT Analyser, Version: 1.9.3.2
CT Analyser, Version: 1.9.3.2
CT Analyser, Version: 1.9.3.2
CT Analyser, Version: 1.9.3.2
CT Analyser, Version: 1.9.3.2
CT Analyser, Version: 1.9.3.2
Date and time,25.07.2014 09:55
Date and time,25.07.2014 09:55
Date and time,25.07.2014 09:56
Date and time,25.07.2014 09:56
Date and time,25.07.2014 09:56
Date and time,25.07.2014 09:55
Operator identity,svy557
Operator identity,svy557
Operator identity,svy557
Operator identity,svy557
Operator identity,svy557
Operator identity,svy557
Computer name,UT156805
Computer name,UT156805
Computer name,UT156805
Computer name,UT156805
Computer name,UT156805
Computer name,UT156805
Computation time,00:08:13
Computation time,00:08:13
Computation time,00:08:24
Computation time,00:08:24
Computation time,00:08:24
Computation time,00:08:13
Dataset,583_right__rec_tra_voi
Dataset,583_right__rec_tra_voi
Dataset,591_right__rec_tra_voi
Dataset,591_right__rec_tra_voi
Dataset,591_right__rec_tra_voi
Dataset,583_right__rec_tra_voi
Location,D:\Pam Mandible Copy\583 Right\Region1\
Location,D:\Pam Mandible Copy\583 Right\Region1\
Location,D:\Pam Mandible Copy\591 Right\Region1\
Location,D:\Pam Mandible Copy\591 Right\Region1\
Location,D:\Pam Mandible Copy\591 Right\Region1\
Location,D:\Pam Mandible Copy\583 Right\Region1\
Obrigado novamente por toda a ajuda
Responder1
Eu suspeitaria que existam espaços à direita nessas linhas, e isso está empurrando tudo para o contorno. Você já tentou despejar o início de um arquivo em octal/hex para ver se é esse o caso?
Você poderia então usar um sed
comando simples para corrigir todos os arquivos em um script de shell em loop antes de começar.
Responder2
O que provavelmente acontece aqui é que os arquivos originais contêm quebras de linha do Windows. O comando paste
parece dar errado com as quebras de linha do Windows em combinação com o delimitador. Você pode verificar isso usando od
os arquivos. Se contiver \r\n
, primeiro você precisa corrigir isso. A correção disso pode ser feita com dos2unix
.
Uma verificação no meu sistema:
[stc@se] $ echo -e "foo\r" > a ; echo -e "bar\r" > b
[stc@se] $ od -c a
0000000 f o o \r \n
0000005
[stc@se] $ paste a b
foo bar
[stc@se] $ paste -d"," a b
,bar
Corrigindo isso com dos2unix
:
[stc@se] $ dos2unix a b
dos2unix: converting file a to Unix format...
dos2unix: converting file b to Unix format...
[stc@se] $ paste -d"," a b
foo,bar
dos2unix
não é instalado por padrão em todos os sistemas Linux, então talvez você ainda precise instalá-lo.