2013-06-03 10 views
14

Devo unire più file CSV con le stesse intestazioni. Devo mantenere l'intestazione del primo file e rimuovere le intestazioni di tutti gli altri file e unirli e creare un file master.Unix: unire più file CSV con la stessa intestazione mantenendo l'intestazione del primo file

file di 1:

Id,city,name ,location 
1,NA,JACK,CA 

file di 2:

ID,city,name,location 
2,NY,JERRY,NY 

uscita:

Id,city,name,location 
1,NA,JACK,CA 
2,NY,JERRY,NY 

Attualmente sto usando questo codice:

ls *.csv | xargs -n 1 tail -n+2 > master.csv 

Questo codice fonderà perfettamente i file, ma poiché ho bisogno dell'intestazione del primo file, questo non mi darà l'intestazione.

Cosa devo fare?

risposta

47
awk 'FNR==1 && NR!=1{next;}{print}' *.csv 

testato su Solaris Unix:

> cat file1.csv 
Id,city,name ,location 
1,NA,JACK,CA 
> 
> cat file2.csv 
ID,city,name,location 
2,NY,JERRY,NY 
> 
> nawk 'FNR==1 && NR!=1{next;}{print}' *.csv 
Id,city,name ,location 
1,NA,JACK,CA 
2,NY,JERRY,NY 
> 
+0

grazie mille. Funziona bene. – user2376510

+5

Spiegazione: FNR è il numero di righe (record) letti finora nel file corrente. NR è il numero di righe letto in generale. Quindi la condizione 'FNR == 1 && NR! = 1 {next;}' dice, "Salta questa riga se è la prima riga del file corrente e almeno 1 riga è stata letta nel suo complesso." Questo ha l'effetto di stampare l'intestazione CSV del primo file mentre lo si ignora nel resto. –

+3

Per i noob come me ... Ho aggiunto il '> master.csv' alla fine per creare il nuovo file con tutti i dati invece di eseguire il CLI –

0

Se Perl è un'opzione:

perl -ne 'print if $. > 1 or ! $h; $h=1; close ARGV if eof' *.csv > master.csv

$. è il numero di riga.
NON viene ripristinato automaticamente tra i file, quindi è necessario close ARGV if eof.
$h registra se l'intestazione è già stata stampata.

0
<?php 
ini_set('auto_detect_line_endings', true); 
$dir = "include/*.csv"; 
$returnVal = array(); 
foreach (glob($dir) as $file) { 
    $header = null; 
    $file = fopen($file, 'r') or die('Unable to open file!'); 
    while(($row = fgetcsv($file)) !== false){ 
     if($header === null){ 
      $header = $row; 
      continue; 
     } 
     $newRow = array(); 
     for($i = 0; $i<count($row); $i++){ 

      $newRow[] = $row[$i]; 
     } 
     if($newRow[0] == null) 
     break; 
     else 
     $returnVal[] = $newRow; 
    } 
    fclose($file); 
} 
//var_dump($returnVal); 
$output = fopen("file.csv",'w') or die("Can't open output"); 
fputcsv($output, array('Date','close','open')); 
foreach($returnVal as $product) { 
    fputcsv($output, $product); 
} 

fclose ($ output) or die ("Impossibile chiudere php: // output"); ?>

+0

Incollare il codice non è sufficiente. Dicci qualcosa a riguardo – kwoxer

Problemi correlati