파일에서 라인을 두 개씩 그룹화하는 방법은 무엇입니까?


9

다음과 같은 텍스트 파일이 있습니다.

a
b
c
d
e
f
g

이 줄을 그룹화하여 다음과 같은 출력을 얻는 방법은 무엇입니까?

a-b
b-c
c-d
d-e
e-f
f-g

쉘 (sh, csh, bash) 에서이 작업을 수행해야합니다.

나는 이것을 발견했다 :

cat file | xargs -n2

그러나 첫 번째 그룹의 마지막 요소는 두 번째 그룹의 첫 번째 요소가되지 않았습니다.

답변:


9

awk:

awk 'NR!=1{print x"-"$0}{x=$0}' file
  • NR!=1 첫 번째 줄을 제외한 모든 줄에 적용
  • print x"-"$0 사이에 대시를 사용하여 값을 인쇄하십시오.
  • x=$0설정 x(다음 반복)

5

POSIX로 sed:

sed '1{
  h
  d
}
H
x
s/\n/-/
' <file

또는 한 줄짜리 버전 :

sed -e '1{h;d' -e\} -e 'H;x;s/\n/-/' <file

나는 ... 첫 번째 줄에서 마지막으로 두 번째 줄의 첫 글자를 필요
Costel 발타 - 코만

홀드 공간을 잘 사용합니다.
와일드 카드

그래, 괜찮아
mikeserv

이것이 어떻게 작동하는지 설명해 주시겠습니까?
Yossarian

5
paste -d- - ./infile <infile

^ 입력 내용이 하나씩 인 것을 제외하고는 정말 잘 작동합니다. 그래서...

{ echo; cat <infile; } | paste -d- - ./infile | sed '1d;$d'

... 작동하지만 너무 복잡 할 수 있습니다 ...


글쎄, 그것은 OP 요구 사항을 잘못 읽은 후 처음에 내 생각과 똑같습니다. 그러나 나는 sed그것을 혼자 내버려두기로 결정했습니다 .
cuonglm

@ cuonglm-내가 잘못 읽었습니까?
mikeserv

1
아니, 내기. 그러나 sed 1d\;\$d수정해야합니다.
cuonglm

이 변형은 어떻습니까? sed '2~2p' infile | paste -d- - -
스틸 드라이버

1
이제 알겠습니다. paste -d- <(head -n -1 input) <(tail -n +2 input)
Costas

2

하나 더 sed

sed '$!N;s/\n/-/p;s/-/\n/;D' <input

수정 될 수 있습니다 ( mikeserv 덕분에 ).

sed -n 'N;y/\n/-/;P;y/-/\n/;D' <input

1
y/-\n/\n-/s /// 둘 다를 대체 할 수 있습니다. 만약 그렇게한다면 더 빠르고, 휴대하기 편리하고 더 짧을 것입니다.
mikeserv

1

순수한 배쉬 버전-

old=""; while read -r line ; do [[ -n "$old" ]] && echo   $old-$line;   old=$line; done  < input

a-b
b-c
c-d
d-e
e-f
f-g
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.