与えられたファイルは必ずいいえメモリサイズの制限により、変数に保存して繰り返します。
例:
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からコピーして一度に1つずつ処理する必要があります。
何が問題なの?
問題は、リストが長い場合は、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_