abc.txt 파일입니다.
NAME="MARK" StartTime="14:11:26.710583" TotalElapsedTime="0" Pool="10" ThreadsReached="0"
NAME="MARK" StartTime="14:11:26.710583" TotalElapsedTime="0" Pool="10" ThreadsReached="0"
다음 형식의 abc.csv 출력이 필요합니다.
NAME StartTime TotalElapsedTime Pool ThreadsReached
MARK 14:11:26.710583 0 10 0
MARK 14:11:26.710583 0 10 0
답변1
기본 CSV 형식은 쉼표를 ,
필드 구분 기호로 가정하므로 다음 GNU는sed방법:
sed -e '1iNAME,StartTime,TotalElapsedTime,Pool,ThreadsReached' -e 's/[^=]*="\([^"]*\)"/\1,/g; s/,$//g' file
산출:
NAME,StartTime,TotalElapsedTime,Pool,ThreadsReached
MARK,14:11:26.710583,0,10,0
MARK,14:11:26.710583,0,10,0
1i
- 인서트머리글파일의 첫 번째 줄 앞의 줄
s/[^=]*="\([^"]*\)"/\1,/g
- 모든 속성값 추출
답변2
while IFS= read -r l; do
set -f; IFS==; set -- $l; shift; N=$#
for arg
do
set -- ${1+"$@"} "$(expr " $arg" : ' "\(.*\)"')"
done
shift "$N"; IFS=,; echo "$*"
done < abc.txt
while IFS= read -r l; do
set -f; IFS==; set -- $l; shift
while case ${#} in 1 ) break ;; esac; do
expr " $1" : ' "\(.*\)"'
shift
done | tr \\n ,; expr " $*" : '.*"\(.*\)"'
done < abc.txt
perl -lne '$,=",";
print /(?:^|\h)\K[^=]*/g if $. == 1;
print /="([^"]*)"/g;
' abc.txt
설명하다
/(?:^|\h)\K[^=]*/g
Perl 코드에서는 첫 번째 줄부터 시작하여 디스플레이 가로 공백 왼쪽이나 줄 시작 부분에 있는 문자를 가져오기 위해 읽는 정규식을 통해 필드 이름을 추출합니다 . 그런 다음 쉼표로 설정하여 인쇄하세요.non=
\h
^
OFS
$,
- 모든 줄(첫 번째 줄 포함)에 대해 정규식을 통해 필드 값을 추출합니다.
/="([^"]*)"/g
이는 큰따옴표로 묶인 문자열을 추출하는 것으로 읽혀집니다(큰따옴표가 이스케이프되지 않는다고 가정). 문자열은 왼쪽에 인접합니다. 그 위에 등호가 있습니다. 그런 다음 이 값 세트stdout
를OFS
. - 루프 솔루션의 경우
while
먼저 토큰화 없이 행을 있는 그대로 읽습니다. 그런 다음 IFS를 an으로 설정하고=
첫 번째 필드를 거부합니다. 이제 모든 필드의 형식은 다음과 같습니다."..."...
그런 다음 유틸리티를 사용하여expr
큰따옴표 안의 값을 풍부하게 하고$@
배열에 배치합니다. 루프가 끝나면for
원래 요소( )를 제거$N
하고 남은 것은 우리가 원하는 것입니다. 마지막으로 IFS를 쉼표로 설정하고 확장하여 쉼표로 연결합니다$*
.