나는 다음을 가지고 있습니다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에게 개행 문자를 인쇄하도록 지시합니다.