주어진 파일은 반드시아니요메모리 크기 제한으로 인해 변수에 저장한 후 반복합니다.
예:
var=$(cat FILE)
for i in $var
do
echo $i
done
위의 예와 같은 방식으로 파일의 모든 문자열을 반복하면서 공백으로 구분된 각 문자열을 파일에서 직접 추출하려면 어떻게 해야 합니까?
예:
fileindex=1
totalfilecount=$(cat FILE | wc -w)
while (( ${fileindex} <= ${totalfilecount} ))
do
onefilename= ??? missing command using fileindex
((fileindex+=1))
done
파일을 배열로 처리하고 색인 위치를 사용하여 단어를 추출할 수 있는 명령이 있습니까?
아이디어는 파일이 배열인 것처럼 파일의 각 단어를 처리하는 것입니다.
입력 파일 예:
one two
three four
five six
다음은 위 기능이 필요한 시나리오입니다.
- server_A와 server_B가 있습니다.
- server_A는 sftp(sftp만 해당)를 통해 server_B에 연결하고 일부 파일을 "가져와야" 합니다.
- sftp의 "ls" 또는 "ls -l" 명령은 모두 와일드카드를 사용하여 특정 파일을 필터링할 수 있습니다.
- 각 파일은 여러 가지 이유로 개별적으로 처리되어야 합니다.
- 파일을 server_B에 그룹으로 복사한 다음 개별적으로 처리할 수 없습니다.
- 파일 목록은 먼저 server_A에서 생성되어야 하며, 목록의 각 파일은 server_B에서 복사되어 한 번에 하나씩 처리되어야 합니다.
뭐가 문제 야?
문제는 목록이 긴 경우 "ls" 명령이 어떻게 2열 단어 목록을 생성하여 항상 단일 열 목록을 생성하는 "ls -l"과 같은 간단한 처리를 허용하지 않는다는 것입니다.
이것은 내 원래 질문으로 이어집니다. 그러한 솔루션이 존재합니까?
답변1
각 단어에 대해 이 작업을 수행할 수 있으며 awk
이는 메모리 요구 사항을 충족해야 합니다.
awk -v RS=\ '{
# Do something with the word
print
}' file
를 사용하여 원하는 문자열을 지정할 수 있습니다 NR
.
$ awk -v RS=\ 'NR==2{print}' <<< 'foo bar baz'
bar
답변2
"문자열"이라고 하면 "단어"를 의미하는 거죠? 공백으로 구분된 문자열입니다. 귀하의 예를 바탕으로 순차적으로 액세스하려고 합니다.
넌 할 수있어:
$ sed 's/[ \t]\+/\n/g' YOUR_FILE | while read -r word ; do PROCESS $word ; done
사용 예:
% echo word1 word2 > YOUR_FILE
% echo word3 word4 >> YOUR_FILE
% echo word5 word6 >> YOUR_FILE
% sed 's/[ \t]\+/\n/g' YOUR_FILE | while read -r word ; do echo _${word}_ ; done
_word1_
_word2_
_word3_
_word4_
_word5_
_word6_