我有一个文件列表,其中两个后续的文件总是属于一起.我想在每次迭代时从for list中提取一个for循环提取两个文件,然后一次处理这两个文件(举个例子,假设我想要连接,即cat两个文件).
在一个简单的例子中,我的文件列表是这样的:
FILES="file1_mateA.txt file1_mateB.txt file2_mateA.txt file2_mateB.txt"
Run Code Online (Sandbox Code Playgroud)
我可以破解它并说
FILES="file1 file2"
for file in $FILES
do
actual_mateA=${file}_mateA.txt
actual_mateB=${file}_mateB.txt
cat $actual_mateA $actual_mateB
done
Run Code Online (Sandbox Code Playgroud)
但我希望能够处理配对A和配偶B具有任意名称的列表,例如:
FILES="first_file_first_mate.txt first_file_second_mate.txt file2_mate1.txt file2_mate2.txt"
Run Code Online (Sandbox Code Playgroud)
有没有办法从每次迭代的$ FILES中提取两个值?
cho*_*oba 25
使用数组作为列表:
files=(fileA1 fileA2 fileB1 fileB2)
for (( i=0; i<${#files[@]} ; i+=2 )) ; do
echo "${files[i]}" "${files[i+1]}"
done
Run Code Online (Sandbox Code Playgroud)
你可以使用xargs(1),例如
ls -1 *.txt | xargs -n2 COMMAND
Run Code Online (Sandbox Code Playgroud)
交换机-n2让xargs从管道输出中选择2个连续的文件名,这些文件名是传递给COMMAND的
要连接10个文件file01.txt ... file10.txt,可以使用
ls *.txt | xargs -n2 sh -c 'cat $@ > $1.$2.joined' dummy
Run Code Online (Sandbox Code Playgroud)
获取5个结果文件
file01.txt.file02.txt.joined
file03.txt.file04.txt.joined
file05.txt.file06.txt.joined
file07.txt.file08.txt.joined
file09.txt.file10.txt.joined
Run Code Online (Sandbox Code Playgroud)
有关说明,请参阅"info xargs".
您可以从 while 循环中读取值并使用 xargs 将每个读取操作限制为两个标记。
files="filaA1 fileA2 fileB1 fileB2"
while read a b; do
echo $a $b
done < <(echo $files | xargs -n2)
Run Code Online (Sandbox Code Playgroud)