xargs의 형식 출력


10

출력 xargs 디스플레이의 형식을 변경하고 싶습니다

cat k.txt 
1 
2 
3 

cat k.txt | xargs 
1 2 3

그러나 내가하고 싶은 1, 2, 31|2|3. 어떤 제안?


즉,이 같은 (정확히이) 뭔가 얻을 수있는 xargs cat -n,하지만 당신은 단지 개행 문자를 트림하는 경우 쉽게이는 달성 될 수있다 echo $(cat), grep또는 awk(기어를 할 수있는 방법을). xargs현재 목적에 적합하지 않습니다.
41754

답변:


18

다음은 다음과 같은 파일을 가져 오는 방법에 대한 수십 가지 예입니다.

$ 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,

1
에 관해서는 awk내가 짧은 대안을 선호한다 :awk -vORS=, 1 k.txt
manatwork

CentOS에 다음이 있는지 확실하지 않습니다 bash.mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
manatwork

후행 줄 바꿈에 대해 확실하지 않습니다. 내 테스트에 따르면 당신 perl도 먼저 awk가지고 있습니다.
manatwork

나는 paste맨 위에 놓을 것 입니다. 그것이 바로 paste -s여기에있는 것입니다. 표준 명령이며 가장 효율적입니다. 다른 모든 것은 과잉이거나 휴대 성이 없거나 제한이 없습니다.
Stéphane Chazelas

mapfilebash4.0 에서 추가 된 비교적 새로운 것 입니다.
manatwork

4

@ slm은 이미 좋은 대답을 주었지만 귀하의 질문으로 "xargs의 형식 출력"

xargs -I{} echo -n "{}|" < test.txt
  • -I "문자열 바꾸기"옵션입니다.
  • {} 출력 텍스트의 자리 표시 자입니다.
  • 이는 "찾기"에서 중괄호 쌍을 사용하는 것과 유사합니다.

후행 |을 제거 하려면 sed정리를 수행 하는 데 사용할 수 있습니다 .

$ xargs -I{} echo -n "{}|" < k.txt  | sed -e 's/|$//'
1|2|3

"3 | 1 | 2 | 3 |"다음에 여분의 파이프를 고정시킵니다. while 루프 및 awk 솔루션과 동일한 문제가 발생했습니다.
slm

예, 새로운 라인 ..이 경우 tr, sed도 .. 및 기타
라훌 파틸

2

이것은 오래된 실입니다. 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'

분명히 특정 문자를 구분 기호로 사용하면 혼란 스러울 수 있으므로 똑똑해야합니다.


0
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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.