를 통해 파일 이름을 부분 집합화 grep
한 다음 결과 파일을 cat
.for ((i=1;i<23;i+=1));
내 파일이 주어지면 다음과 같이 file1.txt
grep하고 싶습니다 .sample1
grep -w '^sample1' file1.txt > sample1_file.txt
grep -w '^sample2' file2.txt > sample2_file.txt
grep -w '^sample3' file3.txt > sample3_file.txt
....
grep -w '^sample22' file22.txt > sample22_file.txt
그런 다음 다음을 연결합니다.
cat sample1_file.txt sample2_file.txt sample3_file.txt ... sample22_file.txt > final_output.txt
답변1
노력하다:
for i in {1..22}
do
grep -w "^sample$i" "file$i.txt"
done >final_output.txt
노트:
{1..22}
1부터 22까지의 모든 정수를 실행합니다. C에 익숙하지 않은 사람들에게는 아마도 C보다 더 직관적이지만 유연성은 떨어집니다.((i=1;i<23;i+=1))
^sample$i
쉘이 확장되도록 표현식을 작은따옴표가 아닌 큰따옴표 안에 넣는 것이 중요합니다$i
.원하는 것이 이라면
final_output.txt
중간 파일을 만들 필요가 없습니다.final_output.txt
명령문 뒤에 리디렉션을 배치하는 것이 효율적이라는 점에 유의하십시오done
. 이런 방식으로 쉘은 이 파일을 한 번만 열고 닫으면 됩니다.
답변2
너달러 기호가 있는 참조 매개변수 및 변수, 따라서 루프 카운터는 루프 내에서(작은따옴표가 아닌 큰따옴표 내에서) i
사용할 수 있습니다 .$i
do
done
루프 부분을 시작하고 끝내는 키워드.
따라서 간단한 변환은 다음과 같습니다.
> final_output.txt
for (( i = 1 ; i < 23 ; i += 1)); do
grep -w "^sample$i" "file$i.txt" > "sample${i}_file.txt"
cat "sample${i}_file.txt" >> final_output.txt
done
숫자만 포함하는 한 따옴표를 사용할 "file${i}.txt"
필요는 없지만 i
여러 가지 이유로 변수 참조를 인용하는 것이 좋습니다.
밑줄은 변수 이름에서 유효하고 쓰기는 변수를 참조하므로 sample${i}_file.txt
에 중괄호가 필요하다는 점에 유의하세요 .${i}
$i_file.txt
i_file
루프 내에서 파일을 추가하므로 처음 에는 파일을 지우는 것입니다. 물론 필요하지 않은 경우 파일 > final_output.txt
생성을 건너뛰고 .sample1_file.txt
grep ... >> final_output.txt
또는 다음을 사용할 수 있습니다.버팀대 확장for (( ... ))
루프를 사용하여 수동으로 계산하는 대신 숫자 목록을 생성합니다 for i in {1..22}; do ... done
.
또는 표준 POSIX 셸에서:
i=1
while [ "$i" -lt 23 ] ; do
grep ...
i=$((i + 1))
done
답변3
사용:
#/bin/bash
:>final_output.txt
for i in {1..22}; do
a=file"$i".txt
b=sample"$i"_file.txt
grep -w '^sample'"$i" "$a" > "$b"
cat "$b" >> final_output.txt
done
이 줄은 :>final_output
파일을 0바이트로 지웁니다.
"Brace 확장"은 {1..22}
숫자 1 2 3 ... 22의 목록으로 확장됩니다.
이 줄은 for i in {1..22}; do
모든 숫자 1 ... 22를 반복합니다. 모든 숫자를 저장하려면
"추가"( )가 필요합니다. >>
파일로 출력합니다.