출력 xargs 디스플레이의 형식을 변경하고 싶습니다
cat k.txt
1
2
3
과
cat k.txt | xargs
1 2 3
그러나 내가하고 싶은 1, 2, 3
나 1|2|3
. 어떤 제안?
답변
다음은 다음과 같은 파일을 가져 오는 방법에 대한 수십 가지 예입니다.
$ cat k.txt
1
2
3
다음 형식으로 변환하십시오.
1,2,3
함께 플레이하려면이 명령을 사용하여 위 파일을 만들 수 있습니다.
$ cat <<EOF > k.txt
1
2
3
EOF
아래 예는 두 그룹으로 나뉩니다. “작동하는”것과 “거의”작동하는 것. 나는 왜 무언가가 왜 효과가 없는지 아는 것이 왜 가치가 있는지를 보는 것만큼이나 가치가 있기 때문에 이것을 떠난다.
내가 익숙한 대부분의 스크립팅 언어가 표시됩니다. TIMTOWTDI Perl에서 일반적으로 사용되는 유명한 약어와 같이 일부는 여러 번 표시 됩니다.
참고 :,
아래 예에서 쉼표 ( )를 바꾸고 원하는 문자 (예 :)로 바꿀 수 있습니다 |
.
“작동하는”예
이 코드 스 니펫은 원하는 출력을 생성합니다.
paste
명령
$ paste -s -d ',' k.txt
1,2,3
sed
명령
$ sed ':a;N;$!ba;s/\n/,/g' k.txt
1,2,3
$ sed ':a;{N;s/\n/,/};ba' k.txt
1,2,3
perl
명령
$ perl -00 -p -e 's/\n(?!$)/,/g' k.txt
1,2,3
$ perl -00 -p -e 'chomp;tr/\n/,/' k.txt
1,2,3
awk
명령
$ awk '{printf"%s%s",c,$0;c=","}' k.txt
1,2,3
$ awk '{printf "%s,",$0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
$ awk -vORS=, 1 k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
$ awk 'BEGIN {RS="dn"}{gsub("\n",",");print $0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
python
명령
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,3
$ python -c "import sys; print sys.stdin.read().replace('\n', ',').rstrip(',')" <k.txt
1,2,3
배쉬의 mapfile
내장 :
$ mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
1,2,3
ruby
명령
$ ruby -00 -pe 'gsub /\n/,",";chop' < k.txt
1,2,3
$ ruby -00 -pe '$_.chomp!"\n";$_.tr!"\n",","' k.txt
1,2,3
php
명령
$ php -r 'echo strtr(chop(file_get_contents($argv[1])),"\n",",");' k.txt
1,2,3
경고
위의 예는 대부분 잘 작동합니다. 위의 PHP 예제와 같은 숨겨진 문제가 있습니다. 이 함수 chop()
는 실제로에 대한 별칭 rtrim()
이므로 마지막 행의 후행 공백도 제거됩니다.
첫 번째 Ruby 예제와 첫 번째 Python 예제도 마찬가지입니다. 문제는 그들이 어떻게 맹목적으로 후행 특성을 “절단”하는 유형의 작업을 어떻게 사용하는지에 관한 것입니다. 예를 들어 OP가 제공 한 예에서는 괜찮지 만 이러한 유형의 라이너 하나를 사용하는 경우 처리중인 데이터와 일치하는지 확인해야합니다.
예
샘플 파일을 다음 k.txt
과 같이 보자.
$ echo -en "1\n2\n3" > k.txt
비슷해 보이지만 약간의 차이가 있습니다. \n
원본 파일과 같이 줄 바꿈 문자 ( ) 가 없습니다 . 이제 첫 번째 파이썬 예제를 실행하면 다음과 같이됩니다.
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,
“거의”작동하는 예
이것들은 “항상 신부 들러리, 결코 신부가 아닙니다” 예입니다. 대부분은 적응할 수 있지만 문제에 대한 잠재적 인 해결책을 찾을 때, “강제”라고 느끼면 작업에 대한 잘못된 도구 일 것입니다!
perl
명령
$ perl -p -e 's/\n/,/' k.txt
1,2,3,
tr
명령
$ tr '\n' ',' < k.txt
1,2,3,
cat
+의 echo
명령 :
$ echo $(cat k.txt)
1 2 3
ruby
명령
$ ruby -pe '$_["\n"]=","' k.txt
1,2,3,
배쉬 while
+ read
내장 :
$ while read line; do echo -n "$line,"; done < k.txt
1,2,3,
답변
@ slm은 이미 좋은 대답을 주었지만 귀하의 질문으로 “xargs의 형식 출력”
xargs -I{} echo -n "{}|" < test.txt
-I
“문자열 바꾸기”옵션입니다.{}
출력 텍스트의 자리 표시 자입니다.- 이는 “찾기”에서 중괄호 쌍을 사용하는 것과 유사합니다.
후행 |
을 제거 하려면 sed
정리를 수행 하는 데 사용할 수 있습니다 .
$ xargs -I{} echo -n "{}|" < k.txt | sed -e 's/|$//'
1|2|3
답변
이것은 오래된 실입니다. OP는 이와 같은 간단한 코드로 물었습니다. 원본과 가깝게 유지하려면 간단한 해결책이 있습니다.
cat k.txt | xargs
1 2 3
sed를 사용하십시오
cat k.txt | xargs | sed 's/ /,/g'
1,2,3
또는
cat k.txt | xargs | sed 's/ /|/g'
1|2|3
sed는 조금 이상하게 보일 수 있지만 세분화되어 많은 의미가 있습니다.
의 대체입니다. g ‘는 전역을위한 것입니다 : 이것 없이는, 각각의 새로운 줄에서 첫 번째 치환 만 할 것입니다. ‘xargs’를 사용하므로 한 줄로 표시합니다. “1,2 3″을 얻게됩니다.
분리 문자는 분리에 사용됩니다. / 문자를 사용했습니다. 한 가지 흥미로운 트릭 : 따옴표 사이에 동일한 형식을 유지하는 한 구분 기호를 다른 문자로 바꿀 수 있습니다. 그래서 이것은 또한 작동합니다 ….
cat k.txt | xargs | sed 's# #,#g'
또는
cat k.txt | xargs | sed 'sT T,Tg'
분명히 특정 문자를 구분 기호로 사용하면 혼란 스러울 수 있으므로 똑똑해야합니다.
답변
xargs <k.txt | tr \ \|
당신은 필요하지 않습니다 cat
– 단지 파일 입력에 전달하고 – 다른 명령을 제공하는 경우 – xargs
와 종류입니다 – 기본 형식 밖으로 전달합니다 /bin/echo
‘의 (백 슬래시 C-탈출 해석없이)를 .
xargs
입력 파일에서 헤드 / 테일 공백을 제거하고 다른 일련의 공백을 단일 공백으로 압축합니다. 이것은 파일 tr
을 다음 xargs
과 같이 전달하는 동안 다음을 의미합니다 .
tr \\n \| <k.txt | xargs
…인쇄물…
1|2|3|
…가는 다른 방법으로 하고에서만 작동 인수 하는 것이 xargs
공간 구분합니다는 않습니다 ….
1|2|3\n
… xargs
마지막 후행 줄 바꿈을 인쇄 하기 때문에 (텍스트 파일에 필요)tr
그 방법으로 기울어 지지 않습니다 .
그러나 이것 (또는 여기에 제공된 다른 솔루션) 은 xargs
인용 을 인용 하지 않습니다 . xargs
입력에 문자 그대로 단일 / 이중 / 백 슬래시 인용 비 줄 바꿈 공백 문자를 전달합니다.
xargs <<\IN
1 2' 3'\' \'4
IN
1 2 3' '4