별도의 줄을 따옴표로 묶은 항목이 있는 쉼표로 구분된 목록으로 변환

별도의 줄을 따옴표로 묶은 항목이 있는 쉼표로 구분된 목록으로 변환

설치를 위해 R에 전달할 수 있는 목록으로 변환하려는 다음 데이터(Rmarkdown 파일에서 구문 분석된 R 패키지 목록)가 있습니다.

d3heatmap
data.table
ggplot2
htmltools
htmlwidgets
metricsgraphics
networkD3
plotly
reshape2
scales
stringr

목록을 다음 형식의 목록으로 바꾸고 싶습니다.

'd3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'

현재 원본 파일에서 위 목록까지의 bash 파이프라인이 있습니다.

grep 'library(' Presentation.Rmd \
| grep -v '#' \
| cut -f2 -d\( \
| tr -d ')'  \
| sort | uniq

새 줄을 쉼표로 구분된 목록으로 변환하는 단계를 추가하고 싶습니다. 추가하려고 했으나 tr '\n' '","'실패했습니다. 또한 다음 스택 오버플로 답변 중 일부를 시도했지만 실패했습니다.

이로 인해 결과가 나왔습니다 library(stringr)))phics).

이로 인해 결과가 나왔습니다 ,%.

이 답변( -i플래그 제거)은 입력과 동일한 출력을 생성합니다.

답변1

따옴표를 추가할 수 있습니다.sed그런 다음 행을 다음과 비교하십시오.반죽, 이렇게:

sed 's/^\|$/"/g'|paste -sd, -

GNU coreutils 기반 시스템(예: Linux)을 실행하는 경우 후행 '-'.

입력한 데이터에 DOS 스타일 줄 끝(@phk 제안)이 있는 경우 다음과 같이 명령을 수정할 수 있습니다.

sed 's/\r//;s/^\|$/"/g'|paste -sd, -

답변2

사용 awk:
awk 'BEGIN { ORS="" } { print p"'"'"'"$0"'"'"'"; p=", " } END { print "\n" }' /path/to/list
쉘 이스케이프가 적어서 가독성이 더 높은 대안:
awk 'BEGIN { ORS="" } { print p"\047"$0"\047"; p=", " } END { print "\n" }' /path/to/list
산출:
'd3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'
설명하다:

awk스크립트 자체에는 이스케이프가 전혀 없습니다 BEGIN { ORS="" } { print p"'"$0"'"; p=", " } END { print "\n" }. 첫 번째 항목을 인쇄한 후 변수가 p설정됩니다(이전에는 빈 문자열과 같았습니다). p각 항목에 대해 이 변수를 사용 하거나 awk-speak를 사용하십시오.기록)는 접두사이며 그렇지 않으면 작은따옴표로 인쇄됩니다. 레코드 구분자 변수를 출력할 필요가 없습니다(접두사가 이미 이를 수행하므로). ing 시 이를 공백으로 설정하십시오 awk. 아, 파일에 개행 문자를 추가할 수 있습니다(예: 다른 텍스트 처리 도구와 함께 작동하도록). 필요하지 않은 경우 그 뒤의 부분과 그 뒤의 모든 항목을 제거할 수 있습니다(작은따옴표 내).ORSBEGINENDEND

노트

Windows/DOS 스타일 줄 끝( )이 있는 경우 \r\n먼저 UNIX 스타일( )로 변환해야 합니다 \n. 이렇게 하려면 tr -d '\015'파이프라인 시작 부분에 다음을 넣을 수 있습니다.

tr -d '\015' < /path/to/input.list | awk […] > /path/to/output

\r(파일에 s를 전혀 사용하지 않는다고 가정합니다. 여기서는 꽤 안전한 가정입니다.)

또는 dos2unix /path/to/input.list한 번만 실행하여 파일을 내부에서 변환하세요.

답변3

~처럼@don_crissti의 연결된 답변붙여넣기 옵션이 엄청나게 빠르다는 것을 보여줍니다. Linux 커널의 파이프라인은 제가 지금까지 시도한 어떤 것보다 더 효율적입니다. 쉼표 + 공백이 아닌 목록 항목을 구분하는 단일 쉼표에 만족한다면 파이프를 붙여넣으십시오.

(paste -d\' /dev/null - /dev/null | paste -sd, -) <input

합리적인 프로그램보다 더 빠른 flex(!)

%option 8bit main fast
%%
.*  { printf("'%s'",yytext); }
\n/(.|\n) { printf(", "); }

그러나 괜찮은 성능이 허용되고(스트레스 테스트를 실행하지 않으면 상수 요소 차이를 측정할 수 없으며 모두 순간적입니다) 스플리터가 유연하고 합리적으로 선형이기를 원합니다.

sed "s/.*/'&'/;H;1h;"'$!d;x;s/\n/, /g'

그것은 당신의 투표입니다. 예, 라인 노이즈처럼 보이지만 이 H;1h;$!d;x관용구는 모든 것을 흡수하는 올바른 방법이며 일단 전체가 실제로 읽기 쉬워진다는 것을 깨닫고 나면 s/.*/'&'/후루룩 소리가 나고 s/\n/, /g.


편집: 우스꽝스러운 일이지만, flex를 다른 모든 것보다 앞서게 만드는 것은 매우 쉽습니다. 내장된 멀티스레딩/신호 처리기 동기화가 필요하지 않다고 stdio에 알려주십시오.

%option 8bit main fast
%%
.+  { putchar_unlocked('\'');
      fwrite_unlocked(yytext,yyleng,1,stdout);
      putchar_unlocked('\''); }
\n/(.|\n) { fwrite_unlocked(", ",2,1,stdout); }

압력을 가할 경우 스틱 파이프보다 2~3배 빠르며 스틱 자체는 다른 파이프보다 최소 5배 빠릅니다.

답변4

파이썬

파이썬 한 줄:

$ python -c "import sys; print(','.join([repr(l.strip()) for l in sys.stdin]))" < input.txt                               
'd3heatmap','data.table','ggplot2','htmltools','htmlwidgets','metricsgraphics','networkD3','plotly','reshape2','scales','stringr'

작동 방식은 간단합니다. 쉘의 <연산자를 사용하여 input.txt를 stdin으로 리디렉션하고, 각 줄을 목록으로 읽고, .strip()줄 바꿈을 제거하고, repr()각 줄에 인용된 표현을 만듭니다. 그런 다음 함수를 통해 목록을 하나의 큰 문자열로 연결하고 구분 기호를 사용합니다 .join().,

또는 제거된 각 줄에 따옴표를 연결하여 사용할 수 있습니다 +.

 python -c "import sys;sq='\'';print(','.join([sq+l.strip()+sq for l in sys.stdin]))" < input.txt

진주

본질적으로 이전과 동일한 아이디어입니다. 모든 줄을 읽고, 뒤따르는 줄 바꿈을 제거하고, 작은따옴표로 묶고, 모든 것을 @cvs 배열에 채우고, 쉼표로 연결된 배열 값을 인쇄합니다.

$ perl -ne 'chomp; $sq = "\047" ; push @cvs,"$sq$_$sq";END{ print join(",",@cvs)   }'  input.txt                        
 'd3heatmap','data.table','ggplot2','htmltools','htmlwidgets','metricsgraphics','networkD3','plotly','reshape2','scales','stringr'

관련 정보