셸 결과를 열의 Excel 파일로 변환

셸 결과를 열의 Excel 파일로 변환

다음 결과를 제공하는 셸 스크립트를 실행 중이며 결과를 Excel의 다른 열(호스트, 상태, 만료, 일)에 저장하고 싶습니다. 엑셀로 어떻게 변환하나요?

Host                                            Status       Expires      Days
----------------------------------------------- ------------ ------------ ----
FILE:certs/dnscert.crt                          Valid        Aug  4, 2021  359

답변1

예제 입력을 수정합니다.

$ cat input
Host                                            Status       Expires      Days
----------------------------------------------- ------------ ------------ ----
FILE:certs/dnscert1.crt                         Valid        Aug  1, 2020  7
FILE:certs/dnscert2.crt                         Invalid      Aug  4, 2021  359
FILE:certs/dnscert3.crt                         Valid        Aug  4, 2021  359

그런 다음 다음 awk명령을 적용하면 다음과 같은 결과를 얻습니다.

$ awk 'NR > 2 { print $1 "," $2 ",\"" $3, $4, $5 "\"," $6}' input
FILE:certs/dnscert1.crt,Valid,"Aug 1, 2020",7
FILE:certs/dnscert2.crt,Invalid,"Aug 4, 2021",359
FILE:certs/dnscert3.crt,Valid,"Aug 4, 2021",359

날짜 필드는 항상 월, 일, 연도의 3개 토큰이라고 가정합니다.

NR > 2처음 두 줄(헤더와 구분 기호)을 건너뜁니다 . 나머지는 그 사이에 쉼표로 구분된 필드를 인쇄하고 날짜 필드를 인용할 때 주의하세요.

답변2

쉘 스크립트가 데이터 배치를 위한 공간을 제공한다고 가정하면 awk를 사용하여 탭으로 구분된 형식으로 변환할 수 있습니다. Excel은 탭으로 구분된 파일을 열고(형식 불일치에 대해 불평할 수 있음) 원하는 경우 사용자가 xlsx로 저장할 수 있도록 허용합니다.

$my_script | awk -v OFS='\t' '{$1=$1}1' > myexcel.xls

OFS를 강제로 적용한 다음 인쇄하는 트릭을 사용합니다. 또는 덜 신비한:

$my_script | '{print $1 "\t" $2 "\t" $3 "\t" $4}' > myexcel.xls

"실제" xlsx 파일(XML의 압축된 디렉터리)을 생성할 수 있는 즐겨찾는 스크립팅 언어용 모듈이 있지만 이는 좀 더 복잡합니다. 사용자가 클릭하여 Excel에서 열 수 있는 항목만 필요한 경우 xls 확장자를 사용하여 탭으로 구분하는 것이 좋습니다.

답변3

필드 자체에도 날짜 필드와 같은 공백이 포함되어 있으므로 다른 전략을 고안해야 합니다.

헤더를 사용하여 각 필드의 필드 너비를 가져오고(필드 이름에 공백이 없다고 가정) 이를 awk의 FIELDWIDTHS 내장 변수에 삽입하여 입력 파일을 두 번째로 전달합니다.

$ fw=$(< file \
   awk -v FPAT='[^[:space:]]+([[:space:]]+|$)' '  NR>1{exit}
{for (i=1; i<=NF; i++) $i=length($i)}1')

$ awk \
  -v q=\" -v OFS=,     \
  -v FIELDWIDTHS="$fw" \
'
function trim(a,  l, t) {
  l = "^[[:space:]]+"
  t = "[[:space:]]+$" 
  re = l "|" t
  gsub(re, "", a)
  return a
}
function quote(a,  r, nondigit) {
  r = "[^[:digit:]]"
  nondigit = a ~ r
  return nondigit ? q a q : a
}
NR==2{next} 
{
  for (i=1; i<=NF; i++) {
    t = $i
    gsub(/"/, "\\&", t)
    t = trim(t)
    $i = quote(t)
  }
}1' file

"Host","Status","Expires","Days"
"FILE:certs/dnscert.crt","Valid","Aug  4, 2021",359

관련 정보