쉼표와 공백을 추가하는 UNIX 명령

쉼표와 공백을 추가하는 UNIX 명령

다음과 같은 파일이 있습니다

$ cat IP
10.3.1.1
10.4.1.1
10.6.3.1
10.19.4.2
10.22.3.4

어떻게 하면 다음과 같이 만들 수 있나요?

$ cat IP 
10.3.1.1, 10.4.1.1, 10.6.3.1, 10.19.4.2, 10.22.3.4

답변1

그리고 perl:

perl -pe 's/\n/, / unless eof' IP

-inplace.txt 파일을 편집 하는 옵션이 추가되었습니다 i. 또는 -i.orig제자리에서 편집하되 원본 콘텐츠를 IP.orig.

셸을 사용하면 zsh다음을 사용하여 이러한 IP를 배열에 로드할 수도 있습니다.

ips=( ${(f)"$(<IP)"} )

그런 다음 j쉼표로 다시 작성하십시오.

print -r -- ${(j[, ])ips} > IP

한 번에 한 줄씩 처리하는 Perl과 달리 Perl은 전체 파일을 메모리에 로드합니다.

다른 두 가지 차이점:

  • 빈 줄은 버려집니다.
  • 원본 파일에 빈 파일이 없거나 마지막 줄이 적절하게 구분되지 않은 파일이 있더라도 줄바꿈 문자는 항상 끝에 추가됩니다.

답변2

GNU를 통해 구현됨 sed:

sed -z 's/\n*$//;s/\n/, /g;s/$/\n/' IP

답변3

아마도

perl -e 'print join(", ", map { chomp; $_ } <>), "\n"' IP

또는

awk '{ printf "%s%s", c, $0; c = ", " } END { print "" }' IP

또는 빠르고 더러운 해킹을 수행하고 파일의 줄 수(아마도 8000개만)로 제한하고 이것이 xargs실제로 이것을 위해 설계되지 않았다는 것을 기억하십시오

xargs <IP | sed 's/ /, /g'

이들 모두는 예제 데이터 세트에서 동일한 출력을 생성합니다.

10.3.1.1, 10.4.1.1, 10.6.3.1, 10.19.4.2, 10.22.3.4

그런 다음 해당 출력을 임시 파일로 리디렉션한 다음 원본 파일을 덮어쓸 수 있습니다. 여기에서 command_from_above변경 사항을 작성하기 위해 선택한 명령으로 바꾸십시오(이 답변 또는 다른 사람이 여기에 있음).표준 출력원본 파일 대신:

command_from_above >"IP.$$.tmp" && mv -f -- "IP.$$.tmp" IP
rm -f -- "IP.$$.tmp"

답변4

awk를 사용하세요:

awk '{printf "%s%s", (NR==1) ? "" : ", ", $0}END{print ""}'

이렇게 하면 첫 번째 줄을 제외한 모든 줄에 쉼표 접두사가 추가됩니다.

관련 정보