출력 형식을 csv 형식으로 지정해야 함

출력 형식을 csv 형식으로 지정해야 함

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

설명

  • Perl 코드에서 첫 번째 줄에서 우리는 정규 표현식을 통해 필드 이름을 추출합니다. 이 필드 이름은 왼쪽에 가로 공백 또는 줄 시작 부분이 보이는 문자 /(?:^|\h)\K[^=]*/g의 실행을 가져옵니다 . 그런 다음 쉼표로 설정 하여 인쇄됩니다 .non=\h^OFS $,
  • 모든 줄(첫 번째 줄 포함)에 대해 정규식을 통해 필드 값을 추출합니다. 이 필드 값은 /="([^"]*)"/g등호에 인접한 큰따옴표 값(이스케이프된 큰따옴표가 없다고 가정)으로 묶인 문자열을 추출하는 것으로 읽혀집니다. 왼쪽. 그런 다음 이러한 값의 컬렉션을 가져 stdout와서 OFS.
  • 루프 솔루션 의 경우 while먼저 단어 분할 없이 있는 그대로 줄을 읽습니다. 그런 다음 IFS를 an으로 설정하고 =첫 번째 필드를 거부합니다. 이제 모든 필드는 다음과 같은 형식을 갖게 됩니다. "..."...그런 다음 expr유틸리티를 사용하여 큰따옴표 안의 값을 구체화하고 $@배열에 배치합니다. 루프 가 끝나면 for원래 요소( )를 제거하고 $N남은 것은 우리가 원하는 것입니다. 마지막으로 IFS를 쉼표로 설정하고 확장하여 쉼표로 결합됩니다 $*.

관련 정보