도움이 필요합니다. 내 명령 출력은 다음과 같습니다.
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 값 인스트림 변수를 생성하는 부작용이 있는 것 같습니다.