ディレクトリ内の複数のファイルのヘッダーを抽出するコマンド[閉じる]

ディレクトリ内の複数のファイルのヘッダーを抽出するコマンド[閉じる]

例:Unixディレクトリに50個のファイルがあり、すべてのファイルのヘッダーを抽出してCSVファイルに書きたいと思います。 CSVファイルには2つの列が含まれています。最初の列はファイル名、2番目の列はタイトルです。

答え1

使用head牛に似た一種の栄養 sed:

head -n 1 -v * | 
sed 'N;s/.* \(.*\) .*\n\(.*\)/\1,\2/p;D'

注:-vファイルが1つしかない場合にのみ必要です。

答え2

BashでXLSファイルを簡単に作成することはできませんが、CSVファイルを作成してExcelにインポートできます。

cd DIRECTORY
rm list-of-headers.csv 2>/dev/null
for f in *; do
    head=$(sed -n -e '1s/"/""/g' -e '1p;q' < "$f")
    file=$(sed 's/"/""/g' <<< "$f")
    printf '"%s","%s"\n' "$file" "$head" >> list-of-headers.csv
done > list-of-headers.csv

これにより、list-of-headers.csvファイル名とヘッダー行を含む2つのカンマ区切りの列で構成されるディレクトリに新しいファイルが作成されます。

  • sed -n -e '1s/"/""/g' -e '1p;q'何でも繰り返す"(遵守するためにRFC 4180)最初の行から印刷して終了します(したがって、sedファイル内の他のすべての行を読む必要はありません)。
  • printf ...ターゲットCSVに行を追加します。

答え3

これはあなたが望むものかもしれません:

awk -v OFS=, 'FNR==1{print FILENAME, $0}' *

または、CSVでそのフィールドを引用する必要がある場合(たとえば、ファイル名またはヘッダー行にカンマを含めることができる場合):

awk 'FNR==1{printf "\"%s\",\"%s\"\n", FILENAME, $0}' *

ファイル名または最初の行に二重引用符または改行(ファイル名の場合)が含まれている場合はYMMV。二重引用符をエスケープするには、次のようにするか、または同様の操作を実行できます。

awk 'FNR==1 {
    gsub(/"/,"\"\"",FILENAME)
    gsub(/"/,"\"\"")
    printf "\"%s\",\"%s\"\n", FILENAME, $0
}' *

ファイル名に改行文字を含めることができ、ExcelにインポートするCSVを作成する場合は、Excelが\nフィールド内のレコードの終わりを区別できるようにORSを変更するだけです\r\n

awk -v ORS='\r\n' 'FNR==1 {
    gsub(/"/,"\"\"",FILENAME)
    gsub(/"/,"\"\"")
    printf "\"%s\",\"%s\"\n", FILENAME, $0
}' *

GNU awkがある場合は、効率のために; nextfile後で追加してください$0

関連情報