내 파일의 예는 다음과 같습니다.
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
\n
BSD는 명령 오른쪽의 개행 문자를 이해하지 못합니다 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
사용 xargs
및 printf
:
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/,$//'