디렉터리에 있는 여러 파일의 헤더를 추출하는 명령 [닫기]

디렉터리에 있는 여러 파일의 헤더를 추출하는 명령 [닫기]

예: Unix 디렉터리에 50개의 파일이 있고 모든 파일의 헤더를 추출하여 CSV 파일에 쓰고 싶습니다. CSV 파일에는 2개의 열이 포함됩니다. 첫 번째 열은 파일 이름이고 두 번째 열은 제목입니다.

답변1

사용 head암소 비슷한 일종의 영양 sed:

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

참고: -v파일이 하나만 있는 경우에만 필요합니다.

답변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파일 이름과 헤더 줄이 포함된 쉼표로 구분된 두 개의 열로 구성된 디렉터리에 새 파일이 생성됩니다.

  • 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.

관련 정보