我有一个名为file_list
的文件,其中包含以空格分隔的字符串,每个字符串都是要处理的文件的文件名。我现在希望循环遍历所有文件名并逐个处理它们。伪代码是
for every filename in file_list
process(filename);
end
我想出了一个相当笨拙的解决方案,这是
filenames='cat file_list'
N
tr -cd ' ' <temp_list | wc -c
N
并按空格解析每个文件名cut
这样做是否更容易/更优雅?
答案 0 :(得分:16)
最简单的方法是在bourne shell中使用一段时间的经典技巧。
for filename in `cat file_list`; do
# Do stuff here
done
答案 1 :(得分:7)
您可以更改文件,使单词以行分隔而不是空格分隔。这样,您可以使用典型语法:
while read line
do
do things with $line
done < file
使用tr ' ' '\n' < file
,您可以用新行替换空格,这样就可以:
while read line
do
do things with $line
done < <(tr ' ' '\n' < file)
$ cat a
hello this is a set of strings
$ while read line; do echo "line --> $line"; done < <(tr ' ' '\n' < a)
line --> hello
line --> this
line --> is
line --> a
line --> set
line --> of
line --> strings
答案 2 :(得分:3)
这是另一种没有人发布过的方法:
str="a b c d"
for token in ${str}; do
echo "$token"
done
答案 3 :(得分:0)
xargs
在这里也适用于漂亮的 1-liner。默认情况下,它会按任何空格拆分。
xargs -n 1 process <file_list
或将文件名放在命令中:
# mac
xargs -n 1 -J % process(%) <file_list
# unix
xargs -n 1 -d " " -i process({}) <file_list