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
다음 이를 새 변수에 저장합니다 .3
1
$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)