Bash 수학 및 파일 [닫기]

Bash 수학 및 파일 [닫기]

Bash를 사용하여 파일의 행과 번호에 대해 계산을 수행해야 합니다. Ruby나 Python과 마찬가지로 문자열을 숫자로 또는 그 반대로 쉽게 변환할 수 있습니다. Bash에서는 모든 것이 유형화되어 있지 않습니다.

1,2,3과 같은 숫자가 포함된 파일이 있습니다. 이를 반복하여 정확히 2를 반환할 수 있습니다.

cat file.txt | sed 's/[^,]//g' | wc -c 

이 결과를 $ 변수에 저장하고 고정된 숫자((3+1))를 추가하고 싶습니다. 예를 들어 $total = 2 + 3 + 1 = 6입니다. 나중에 사용하기 위해 unix 명령의 결과를 변수에 저장하는 방법은 무엇입니까?

number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c ) 
echo "elements are: $number_of_elements" #2
lines = $(( $number_of_elements + 3 + 1)) & echo "lines are: $lines " #2+3+1
cat file.txt | grep -A $lines "text " > output.txt #open file, grep the "text" and the 6 lines that come after.

문제가 있는 것 같습니다. - 명령줄 1/3을 찾을 수 없습니다. - grep의 결과로 $lines에서 작동하지 않습니다.

답변1

명령 대체가 필요합니다 $().

variable=$(sed 's/[^,]//g' file.txt | wc -c)

$variable이제 다음 을 사용하여 변수 참조의 값을 얻을 수 있습니다. 의도하지 않은 효과(단어 분리 및 경로 이름 확장)를 피하기 위해 확장할 때 변수를 인용하는 것이 거의 항상 좋은 생각이므로 를 사용하는 것이 더 좋습니다 "$variable".

cat file.txt파일 이름을 인수 로 사용하여 제거했습니다 sed.

답변2

편집 2: 당신은 할 수아니요Bash에는 변수를 할당할 때 공백이 있습니다. 이것은 (귀하의 게시물에서):

number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c )

...작동하지 않습니다. 그러나 이는 다음과 같습니다.

number_of_elements=$( sed 's/[^,]//g' elements.txt | wc -c )

플래그 앞뒤의 공백을 제거하십시오 =. 명령 대체 사용 방법에 대한 @heemayl의 잘 작성된(그리고 호평을 받은) 답변을 읽어보세요!


이 결과를 $ 변수에 저장하고 고정된 숫자((3+1))를 추가하고 싶습니다. 예를 들어 $total = 2 + 3 + 1 = 6입니다. 나중에 사용하기 위해 unix 명령의 결과를 변수에 저장하는 방법은 무엇입니까?

이 같은:

myVar=2
total=$(($myVar+2+3+1))
echo $total
8

여기서는 변수 $myVar(정수 포함 ) 를 사용하여 2정수를 추가한 2다음 이를 새 변수에 저장합니다 .31$total

답변3

number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c )

number_of_elements명령을 실행 =하고 분할+glob의 결과를 wc명령 출력에 대한 인수로 적용하려고 시도합니다. Bourne과 같은 셸에서 스칼라 변수는 var=value주변 공백 문자 없이 할당됩니다 =( var이 역시 리터럴이어야 하고 유효한 변수 이름이어야 함).

또한 이 명령은 에서 유효한 문자의 일부를 형성하지 않는 , 개행 및 바이트를 제외한 모든 것을 sed제거한다는 점에 유의하십시오 .,elements.txt

,문자 수만 세고 싶다면 다음과 같이 할 수 있습니다.

count=$(tr -cd , < elements.txt | wc -c)

및 개행 의 경우 ,:

count=$(tr -cd ',\n' < elements.txt | wc -c)

(그러나 일부 wc구현 에서는 $count선행 또는 후행 공백이 있을 수 있습니다.)

숫자를 추가하세요.

count=$(($(tr -cd , < elements.txt | wc -c) + 1))

의 내용은 $((...))내부인 것처럼 처리됩니다 "...". 매개변수 확장, 산술 확장 및 명령 대체가 계속 수행됩니다. 위에서 언급한 추가 공백을 제거하려면 실제로 다음을 수행할 수 있습니다.

count=$(($(... | wc -c)))

바꾸다:

count=$(... | wc -c)

관련 정보