두 번째 ","마다 요소를 분리하고 bash의 다음 줄로 푸시합니다.

두 번째 ","마다 요소를 분리하고 bash의 다음 줄로 푸시합니다.

내 파일의 예는 다음과 같습니다.

201012,720,201011,119,201710,16

내가 원하는 출력:

201012,720
201011,119
201710,16

답변1

Sed를 사용하여 루프:

sed -e 's/,/\n/2' -e 'P;D' file

전임자.

$ echo '201012,720,201011,119,201710,16' | sed -e 's/,/\n/2' -e 'P;D'
201012,720
201011,119
201710,16

그러면 두 번째 항목이 ,로 대체된 다음 대체가 더 이상 성공하지 못할 때까지 \n반복적으로 인쇄 및 삭제됩니다 .\n

\nBSD는 명령 오른쪽의 개행 문자를 이해하지 못합니다 s. 이것은 ksh, bash 및 zsh 쉘에 대한 솔루션입니다.

sed -e :a -e $'s/,/\\\n/2' -e 'P;D' file

또는 (이전) sed를 사용한 일반적인 솔루션은 다음과 같습니다.

sed '
:a
s/,/\
/2
P;D
' file

답변2

$ paste -d, - - < <( tr ',' '\n' <file )
201012,720
201011,119
201710,16

또는 프로세스 대체 없이,

$ tr ',' '\n' <file | paste -d, - -
201012,720
201011,119
201710,16

그러면 파일의 모든 쉼표가 를 사용하여 줄 바꿈으로 바뀌고 를 사용 tr하여 paste쉼표로 구분된 두 개의 열이 생성됩니다.

tr너무 단순 하다고 느껴지면 로 대체할 수 sed 'y/,/\n/'있으며 동일한 작업을 수행합니다.

답변3

다음 awk 명령을 사용하여 이 작업을 수행할 수 있습니다.

awk -F, -v OFS=, '{for (i=1;i<=NF;i=i+2) {j=i+1; print $i,$j}}' input

그러면 입력의 각 열을 반복하고(반복할 때마다 2씩 증가) 다음 행으로 이동하기 전에 행의 해당 열과 다음 인접 열을 인쇄합니다.

$ cat input
201012,720,201011,119,201710,16
$ awk -F, -v OFS=, '{for (i=1;i<=NF;i=i+2) {j=i+1; print $i,$j}}' input
201012,720
201011,119
201710,16

답변4

사용 xargsprintf:

xargs -d, printf '%s,%s\n' < file

산출:

201012,720
201011,119
201710,16

위의 코드에서는 행당 짝수 개의 필드가 있다고 가정합니다. 그렇지 않은 경우 xargs별도의 숫자와 쉼표가 인쇄됩니다. 하지만 이 약간 느린 코드는 대부분의 작업을 수행합니다.

tr , '\n' < file | xargs -n2 printf '%s,%s\n' | sed '$s/,$//'

-n2합리적인 최대치까지 증가시키면 속도가 빨라질 수 있습니다.심지어숫자,예를 들어입력 숫자가 15자리를 초과하지 않는다고 가정합니다.

m=$(getconf ARG_MAX) m=$(( (m/16) + (m%2) ))
tr , '\n' < file | xargs -n"${m}" printf '%s,%s\n' | sed '$s/,$//'

관련 정보