
두 숫자를 나누는 간단한 bash 함수가 있습니다.
echo "750/12.5" | bc
의 출력을 가져와 해당 결과를 의 다른 인스턴스에 bc
추가 하고 파이프 하고 싶습니다 ./24
bc
다음과 같은 것 :
echo "750/12.5" | bc | echo $1 + "/24" | bc
$1
파이프된 결과는 어디에 있습니까?
echo "750/12.5/24" | bc
PS 나는 파이프 결과에 텍스트를 추가하는 것과 관련하여 더 많은 질문을 할 수 있다는 것을 알고 있습니다 .
답변1
sed
나는 줄 끝을 사용하고 교체하여 이것을 달성했습니다 .
echo "my text" | sed 's/$/ more text/'
보고:
my text more text
귀하의 예:
echo "750/12.5" | bc | sed 's/$/\/24/' | bc
답변2
대체 접근 방식:
핵심요약: cat
stdin( -
)을 인수로 연결하는 데 사용합니다. 연결된 스트림은 개행으로 구분됩니다. 원하지 않는 경우 제거하십시오.
불행하게도 이 접근 방식은 특정 사용 사례에서는 다소 번거롭습니다. bc
해당 표현식 중간에 개행 문자가 있으면 실패하기 때문입니다.
$ echo "750/12.5" | bc | cat - <(echo "/24") | bc
60
(standard_in) 2: parse error
원래 bc
결과에서 개행 문자를 삭제하면 이 문제를 해결할 수 있습니다.
$ echo "750/12.5" | bc | tr -d '\n' | cat - <(echo "/24") | bc
2
그러나 나는 "bashappend to Pipe"를 검색하여 이 질문에 이르렀고 내 경우에는 실제로하다연결 사이에 개행 문자가 필요합니다. 따라서 같은 이유로 여기에 있는 사람들은 다음을 사용하십시오 | cat - <(...)
.
$ echo foo | cat - <(echo bar)
foo
bar
$ echo foo | cat - <(echo bar) | sort | cat - <(echo last_line)
bar
foo
last_line
$ echo foo | cat - <(echo bar) | sort | cat <(echo header) - <(echo last_line)
header
bar
foo
last_line
답변3
가장 간단한 옵션에서는 파이프 스트림에 추가됩니다.
$ echo "750/12.5" | { bc; echo "/24"; }
60
/24
그러나 tr을 사용해야 하는 것을 피하기 위해 예상치 못한 개행 문자가 있습니다.
$ echo "750/12.5" | { bc | tr -d '\n' ; echo "/24"; }
60/24
또는 명령 확장이 후행 줄 바꿈을 제거한다는 사실을 고려하면 다음과 같습니다.
$ printf '%s' $( echo "750/12.5" | bc ); echo "/24"
60/24
하지만 아마도 올바른 방법은 다음과 비슷할 것입니다.
$ echo "$(echo "750/12.5" | bc )/24"
60/24
bc에서 사용하려면 다음과 같이 작성할 수 있습니다.
$ bc <<<"$(bc <<<"750/12.5")/24"
2
합리적인 부동 숫자 정밀도를 얻으려면 다음과 같아야 합니다.
$ bc <<<"scale=10;$(bc <<<"scale=5;750/12.5")/24"
2.5000000000
bc의 인스턴스가 두 개 있으므로 두 척도가 필요하다는 점에 유의하세요.
물론, bc의 한 인스턴스에는 단 하나의 스케일만 필요합니다.
$ bc <<<"scale=5;750/12.5/24"
사실, 당신이 생각해야 할 것은 문자열에 관한 것입니다:
$ a=$(echo "750/12.5") # capture first string.
$ echo "$a/24" | bc # extend the string
2
위의 규모에 대한 설명은 여기에서도 여전히 유효합니다.
답변4
awk
파이프에 무엇이든 삽입/추가하는 데 사용할 수 있습니다 .
$ date | awk 'BEGIN{print "prefix line"} {print} END{print "suffix line"}'
prefix line
Mo 21. Aug 15:24:30 CEST 2023
suffix line
어디
date
- 입력 파이프입니다(예를 들어 여기에서는 현재 날짜).BEGIN{print "prefix line"}
- 이 블록은 메인 앞에 출력을 삽입합니다.{print}
- 입력 파이프의 내용을 인쇄합니다. 필요한 경우 여기에서 일부 처리를 수행할 수 있습니다.END{print "suffix line"}
- 메인 뒤에 출력을 추가합니다.
한 줄로 동일한 작업을 수행하려면 다음을 사용하십시오 printf
.
$ date | awk 'BEGIN{printf("prefix line >> ")} {printf($0)} END{printf(" << suffix line")}'
prefix line >> Mo 21. Aug 15:32:08 CEST 2023 << suffix line/upload/sc505enb/tmp>
$ echo "750/12.5" | bc | awk '{printf($0)} END{printf("/24\n")}'
60/24