2013-06-03 63 views
14

我必須合併具有相同標題的多個CSV文件。 我必須保留第一個文件的標題並刪除所有其他文件的標題併合並它們並創建一個主文件。Unix:通過保留第一個文件的標題合併具有相同標題的多個CSV文件

文件1:

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

文件2:

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

輸出:

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

目前我使用此代碼:

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

此代碼將完美合併文件,但由於我需要第一個文件的頭文件,因此這不會給我頭文件。

我該怎麼辦?

回答

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

在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

非常感謝。它工作正常。 – user2376510

+5

說明: FNR是到目前爲止在當前文件中讀取的行數(記錄)。 NR是整體讀取的行數。 因此,條件'FNR == 1 && NR!= 1 {next;}'說:「如果它是當前文件的第一行,則跳過這一行,並且總體上至少讀取了一行。這具有打印第一個文件的CSV標題的效果,同時在其他文件中跳過。 –

+3

對於像我這樣的noobs ...我添加'> master.csv'到最後創建所有數據的新文件,而不是運行CLI –

0

如果Perl是一個選項:

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

$.是行號。
它不會在文件之間自動重置,因此需要close ARGV if eof
$h記錄頭是否已經打印。

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(「Can not close php:// output」); ?>

+0

粘貼代碼是不夠的。告訴我們一些事情。 – kwoxer

相關問題