给定的文件必须不是由于内存大小限制,存储在变量中然后进行遍历:
例子:
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 连接到 server_B(仅限 sftp)并“获取”一些文件
- sftp 中的“ls”或“ls -l”命令都可以使用通配符来过滤特定文件
- 每个文件都需要单独处理(出于各种原因)
- 文件不能作为一个组复制到 server_B 然后单独处理
- 必须首先在 server_A 上创建文件列表,然后从 server_B 复制该列表中的每个文件并一次处理一个文件
哪里有问题?
问题是,如果列表很长,“ls”命令如何创建双列单词列表,因此不允许像“ls -l”那样进行简单处理,“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_