Unix: объединить несколько файлов CSV с одним заголовком, сохранив заголовок первого файла
Мне нужно объединить несколько файлов 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
Этот код будет полностью слить файлы, но поскольку мне нужен заголовок первого файла, это не даст мне заголовок.
Что мне делать?
Ответы
Ответ 1
awk 'FNR==1 && NR!=1{next;}{print}' *.csv
тестируется на 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
>
Ответ 2
Если Perl является опцией:
perl -ne 'print if $. > 1 or ! $h; $h=1; close ARGV if eof' *.csv > master.csv
$.
- номер строки.
Это НЕ reset автоматически между файлами, поэтому требуется close ARGV if eof
.
$h
записывает, если заголовок уже был напечатан.
Ответ 3
<?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) или die ( "Невозможно закрыть php://output" );
? >