Unix(Sun Solaris)에서 특정 패턴으로 줄을 병합하는 방법

Unix(Sun Solaris)에서 특정 패턴으로 줄을 병합하는 방법

나는 다음을 가지고 있습니다N플랫 파일의 줄 수:

uk,1234560000
uk,6789067000
uk,4567890000
.
.
.
n lines

이제 다음 형식으로 만들어야 합니다.

uk,1234560000-1234560000,6789067000-6789067000,4567890000-4567890000,......

어떻게 전환할 수 있나요?

답변1

이를 수행하는 방법에는 여러 가지가 있습니다. 다음은 쉘만 사용하는 것입니다(외부 프로그램 없음).

#!/bin/sh
IFS=, read -r f1 f2
printf "%s,%s-%s" "$f1" "$f2" "$f2"
while IFS=, read -r f1 f2
do
    printf ",%s-%s" "$f2" "$f2"
done
printf "\n"

myscript.sh위의 내용을 do chmod +x myscript.sh및 run 이라는 파일 에 넣고 ./myscript.sh입력과 출력이 원하는 곳으로 리디렉션됩니다.

코드는 매우 간단합니다

  • 로 구분된 두 개의 필드를 읽습니다 ,. field1 ,field2 -field2 쓰기 ,아니요개행 문자로 종료됩니다.
  • 파일의 끝은 아니지만 두 개의 필드를 읽고, ,두 번째 필드를 두 번 쓰고, 앞에 a 를 두고 ,, a 로 구분하고 -, 개행 문자로 끝나지 않습니다.
  • 파일 전체를 읽은 후(파일의 끝에 도달) 개행 문자를 씁니다.

답변2

이 파일로 시작하세요:

$ cat file
uk,1234560000
uk,6789067000
uk,4567890000

질문의 형식이 정확하다면 이것이 원하는 대로 작동한다고 생각합니다.

$ awk -F, '1==NR{printf "%s",$1} {printf ",%s-%s",$2,$2} END{print""}' file
uk,1234560000-1234560000,6789067000-6789067000,4567890000-4567890000

어떻게 작동하나요?

awk는 한 번에 하나의 레코드(라인)를 읽습니다. 각 행은 필드로 구분됩니다. 이 예제 파일에서 쉼표를 필드 구분 기호로 사용하는 경우 첫 번째 필드( 라고 함 $1)는 항상 숫자 uk이고 두 번째 필드( 라고 함 $2)는 숫자입니다.

  • -F,

    이로 인해 awk는 쉼표를 필드 구분 기호로 처리합니다.

  • 1==NR{printf "%s",$1}

    NR지금까지 읽은 행 수입니다. 예 1 == NR, 우리는 최전선에 있습니다. 첫 번째 줄에 있을 때 이는 awk에게 첫 번째 필드를 인쇄하라고 지시합니다 uk.

  • printf ",%s-%s",$2,$2

    모든 행에 대해 이는 awk에게 쉼표를 인쇄하고 두 번째 필드와 대시를 인쇄한 다음 두 번째 필드를 다시 인쇄하도록 지시합니다.

  • END{print""}

    이는 파일 끝에 도달하면 awk에게 개행 문자를 인쇄하도록 지시합니다.

관련 정보