라인 헤더를 제거하면서 프로그램 출력의 라인별 청크를 CSV로 변환합니다.

라인 헤더를 제거하면서 프로그램 출력의 라인별 청크를 CSV로 변환합니다.

도움이 필요합니다. 내 명령 출력은 다음과 같습니다.

Server1:  
CPU(S):  8  
RAM: 24  
Socket: 2  

Server2:  
CPU(S):  16   
RAM: 32   
Socket: 5 

원하는 출력:

Server1:,8,24,2  
Server2:,16,32,5    

답변1

awk '
  NF==1 { printf "%s%s", NR==1 ? "" : ORS, $1 }
  NF==2 { printf ",%s", $2 }
  END   { printf "%s", ORS }
' file
  • 행에 필드가 포함된 경우:
    • 이것이 첫 번째 줄이 아니면 개행 문자를 인쇄합니다.
    • 필드 1 인쇄
  • 줄에 두 개의 필드가 포함되어 있으면 쉼표와 field2를 인쇄하세요.
  • 마지막으로 개행 문자를 인쇄합니다.

답변2

$ awk -v RS= -v OFS=',' '{print $1, $3, $5, $7}' file
Server1:,8,24,2
Server2:,16,32,5

답변3

# will be used to remember the previous line
b=;
while read -r a; do 
 # if the previous line was empty, then this line is a title line
 if [ "$b" == "" ]; 
  then echo;
  echo -n $a; 
 # else only output everything after ": "
 else IFS=": " read -r _ digs <<< "$a"; 
 # don't want to output a comma for a blank line
  if [ "$a" != "" ]; 
   then echo -n ,$digs;
  fi;
 fi;
 b=$a; 
done < 2

산출:

 
Server1:,8,24,2  
Server2:,16,32,5 

선행 공백을 제거하거나 끝에 빈 줄을 추가하려는 경우 이를 수행하는 방법에는 여러 가지가 있으며 이로 인해 이 스크립트가 더 복잡해집니다. 무엇을 해야할지 모르시면 알려주세요.

답변4

충분히 새로운 버전이 1개 있습니다.밀러

mlr --idkvp --irs '\n\n' --ifs '\n' --ips ':' --ocsvlite --headerless-csv-output \
  clean-whitespace then put 'x=$[[1]]; $[[1]]="1"; $1=x' then remove-empty-columns \
  inputfile

설명하다:

  • --idkvp --irs '\n\n' --ifs '\n' --ips ':' --ocsvlite --headerless-csv-output콜론으로 구분된 키-값 쌍을 사용하여 입력 형식을 단락 모드로 지정하고 한 줄에 하나의 필드를 출력 형식으로 지정하고 csvlite필드 이름 제목 인쇄를 억제합니다.

  • clean-whitespace필드 값에서 선행 및 후행 공백 제거

  • put 'x=$[[1]]; $[[1]]="1"; $1=x'첫 번째 필드의 값을 이름 2 로 설정 하고 이름을 "1"로 설정합니다. 후자는 레코드를 균질화하기 때문에 중요합니다. 그렇지 않으면 --headerless-csv-output작동하더라도 Miller는 각 레코드를 별도의 CSV 청크로 인쇄합니다.

  • remove-empty-columns왜냐하면 --irs '\n\n' --ifs '\n',하나의최종 레코드 뒤의 줄 바꿈은 후행 빈 필드로 처리됩니다. 이 조합은 이를 제거합니다.

첫 번째 필드 값의 일부로 유지 하려면 :절에서 로 변경하세요 $1=x.$1=x.":"put

시험:

$ ~/src/miller/c/mlr --idkvp --irs '\n\n' --ifs '\n' --ips ':' --ocsvlite --headerless-csv-output \
>   clean-whitespace then put 'x=$[[1]]; $[[1]]="1"; $1=x' then remove-empty-columns \
>   inputfile
Server1,8,24,2
Server2,16,32,5

:또는 서버 이름에 그대로 두십시오 .

$ ~/src/miller/c/mlr --idkvp --irs '\n\n' --ifs '\n' --ips ':' --ocsvlite --headerless-csv-output \
>   clean-whitespace then put 'x=$[[1]]; $[[1]]="1"; $1=x.":"' then remove-empty-columns \
>   inputfile
Server1:,8,24,2
Server2:,16,32,5

1은 Miller 5.6.2-dev에서는 작동하지만 Miller 5.3.0에서는 작동하지 않습니다.

2 이름-값 교환이 가능할 것처럼 보이지만아니요임시 변수는

 put '$[ $[[1]] ]=$[[1]]; $[[1]]="1"'

이는 인쇄할 수 없는 이름을 사용하여 추가 null 값 인스트림 변수를 생성하는 부작용이 있는 것 같습니다.

관련 정보