在bash"for $ in list"构造中一次取两个

Ale*_*rdt 12 bash for-loop

我有一个文件列表,其中两个后续的文件总是属于一起.我想在每次迭代时从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)


Fri*_*ner 9

你可以使用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".


Fis*_*ish 7

您可以从 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)

  • 这是最不复杂且最灵活的答案。谢谢,鱼。 (2认同)