ProgramingTip

Unix 명령 줄에서 간결하고 이식 가능한 "join"

bestdevel 2020. 10. 26. 08:26
반응형

Unix 명령 줄에서 간결하고 이식 가능한 "join"


줄 바꿈 문자가있는 구분 기호를 사용하고 후행 구분 기호를 피하고 선택적으로 빈 줄을 무시하고 여러 줄을 한 줄로 결합해야할까요?

예. foo.txt세 줄 의 텍스트 파일을 고려하십시오 .

foo
bar
baz

원하는 출력은 다음과 달라집니다.

foo,bar,baz

지금 사용중인 명령 :

tr '\n' ',' <foo.txt |sed 's/,$//g'

이상적으로는 다음과 가변됩니다.

cat foo.txt |join ,

무엇이 :

  1. 가장 쉽게 가능하고 간결하며 읽기 쉬운 방법입니다.
  2. 비표준 유닉스 도구를 사용하는 가장 간결한 방법입니다.

뭔가를 쓰거나 사용할 수 있습니다. 하지만 옵션을 알고 싶습니다.


놀랍게도이 paste작업을 수행하는 좋은 방법입니다.

paste -s -d","

이것은 당신이 한 빈 줄을 다루지 않을 것입니다. 이를 위해 먼저을 통해 텍스트를 파이프하십시오 grep.

grep -v '^$' | paste -s -d"," -

sed한 줄이 작동합니다.

sed -e :a -e 'N;s/\n/,/;ba' file

테스트 :

[jaypal:~/Temp] cat file
foo
bar
baz

[jaypal:~/Temp] sed -e :a -e 'N;s/\n/,/;ba' file
foo,bar,baz

빈 줄을 처리하기 위해 빈 줄을 제거하고 위의 한 줄로 파이프 할 수 있습니다.

sed -e '/^$/d' file | sed -e :a -e 'N;s/\n/,/;ba'

xargs를 사용하는 것은 무엇입니까?

당신의 경우

$ cat foo.txt | sed 's/$/, /' | xargs

xargs 명령의 입력 제한 길이에주의하십시오. (이것은 매우 긴 입력 파일을 처리 할 수 ​​없음을 의미합니다.)


Perl :

cat data.txt | perl -pe 'if(!eof){chomp;$_.=","}'

놀랍게도 더 짧고 빠 사용.

cat data.txt | perl -pe 'if(!eof){s/\n/,/}'

또는 원하는 경우 :

cat data.txt | perl -pe 's/\n/,/ unless eof'

재미를 위해 여기에 모든 내장 솔루션이 있습니다.

IFS=$'\n' read -r -d '' -a data < foo.txt ; ( IFS=, ; echo "${data[*]}" ; )

후행 개행이 문제인 경우 printf대신 사용할 수 있습니다 echo.

이것은 IFS분리 read구분 기호를 다른 공백이 아닌 개행 문자로 설정 한 다음 일반적으로 사용하는 개행 대신에 read도달 할 때까지 읽기를 중지하지 않도록 지시하고 읽은 nul각 항목을 배열 ( -a) 에 추가하여 작동합니다. 데이터. 그런 다음, 서브 쉘에서 지금과 소지품없는 IFS대화 형 쉘을, 우리는 설정 IFS,와 함께 배열 확장 *첫 번째 문자에서와 배열의 각 항목을 구분,IFS


작업을 수행 비슷한하여 파일에서 쉼표로 구분 된 필드 목록을 인쇄해야 우리 xargs했으며 다음 ruby과 같이 STDOUT을 및에 파이핑하는 데 만족했습니다 .

cat data.txt | cut -f 16 -d ' ' | grep -o "\d\+" | xargs ruby -e "puts ARGV.join(', ')"

일부 데이터가 여러 줄로 나뉘어 진 로그 파일이 있습니다. 이 경우 첫 줄의 마지막 문자는 세미콜론 (;)이었습니다. 다음 명령을 사용하여이 줄을 결합했습니다.

for LINE in 'cat $FILE | tr -s " " "|"'
do
    if [ $(echo $LINE | egrep ";$") ]
    then
        echo "$LINE\c" | tr -s "|" " " >> $MYFILE
    else
        echo "$LINE" | tr -s "|" " " >> $MYFILE
    fi
done

그 결과 로그 파일에서 분할 된 줄이 새 파일에서 한 줄인 파일이됩니다.


ex(빈 줄 무시)를 사용 하여 제자리에 공백이있는 줄을 연결하는 간단한 방법은 다음과 같습니다.

ex +%j -cwq foo.txt

결과를 표준 출력으로 인쇄하려면 다음을 시도하십시오.

ex +%j +%p -scq! foo.txt

공백없이 줄을 연결하려면 +%j!대신을 사용하십시오 +%j.

다른 구분자를 사용하려면 좀 더 까다 롭습니다.

ex +"g/^$/d" +"%s/\n/_/e" +%p -scq! foo.txt

여기서 g/^$/d(또는 v/\S/d) 빈 줄을 제거하고 s/\n/_/기본적으로 사용하는 것과 동일 sed하지만 모든 줄에 대해 작동하는 대체입니다 ( %). 구문 분석이 완료되면 버퍼 ( %p)를 인쇄합니다 . 마지막으로 -cq!vi q!명령을 실행하면 기본적으로 저장하지 않고 종료됩니다 ( -s출력을 침묵시키는 것입니다).

그주의 사항 ex에 해당합니다 vi -e.

이 방법은 대부분의 Linux / Unix가 기본적 으로 ex/ 와 함께 제공되므로 이식성이 뛰어납니다 vi. 그리고 sedin-place 매개 변수 ( -i)가 표준 확장이 아니고 유틸리티 자체가 스트림 지향적 일 때보 다 더 호환 되므로 이식성이 떨어집니다.


내 대답은 :

awk '{printf "%s", ","$0}' foo.txt

printf충분합니다. -F"\n"필드 구분자를 변경할 필요가 없습니다 .

참고 URL : https://stackoverflow.com/questions/8522851/concise-and-portable-join-on-the-unix-command-line

반응형