Unix 명령 줄에서 간결하고 이식 가능한 "join"
줄 바꿈 문자가있는 구분 기호를 사용하고 후행 구분 기호를 피하고 선택적으로 빈 줄을 무시하고 여러 줄을 한 줄로 결합해야할까요?
예. foo.txt
세 줄 의 텍스트 파일을 고려하십시오 .
foo
bar
baz
원하는 출력은 다음과 달라집니다.
foo,bar,baz
지금 사용중인 명령 :
tr '\n' ',' <foo.txt |sed 's/,$//g'
이상적으로는 다음과 가변됩니다.
cat foo.txt |join ,
무엇이 :
- 가장 쉽게 가능하고 간결하며 읽기 쉬운 방법입니다.
- 비표준 유닉스 도구를 사용하는 가장 간결한 방법입니다.
뭔가를 쓰거나 사용할 수 있습니다. 하지만 옵션을 알고 싶습니다.
놀랍게도이 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
. 그리고 sed
in-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
'ProgramingTip' 카테고리의 다른 글
특정 테이블 및 항목 Postgres에 대한 데이터베이스 장식 만들기 (0) | 2020.10.26 |
---|---|
Android : adb : 권한 거부 됨 (0) | 2020.10.26 |
SciPy를 사용 분위수-분위수 전부 (0) | 2020.10.26 |
osx 10.10 HTTPS URL에 대한 Curl POST에서 SSLRead () 오류 발생 (0) | 2020.10.26 |
구성 파일을 저장하고 React를 사용하여 읽는 방법 (0) | 2020.10.26 |