使用shell连接具有相似名称的文件

时间:2015-07-13 23:22:14

标签: shell unix

我对shell脚本的了解非常有限,例如,如果我在文件夹中有以下文件

abcd_1_1.txt
abcd_1_2.txt
def_2_1.txt
def_2_2.txt

我希望输出为abcd_1.txt, def_2.txt。对于文件名中的每个模式,请对文件进行concantenate并生成'pattern'.txt作为输出

patterns list <-?
for i in patterns; do echo cat "$i"* > "$i".txt; done

我不确定如何在shell脚本中编写代码,感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

for i in abcd_1 def_2
do
    cat "$i"*.txt > "$i".txt
done

以上内容适用于任何POSIX shell,例如dash或bash。

如果由于某种原因,你想要维护一个模式列表然后遍历它们,那么使用数组是合适的:

#!/bin/bash
patterns=(abcd_1 def_2)
for i in "${patterns[@]}"
do
    cat "$i"*.txt > "$i".txt
done

数组需要一个高级shell,例如bash。

相关问题:文件订单

将文件添加到abcd_1或def_2的顺序是否重要? *将导致词法排序。这可能与数字排序冲突。例如:

$ echo def_2_*.txt
def_2_10.txt def_2_11.txt def_2_12.txt def_2_1.txt def_2_2.txt def_2_3.txt def_2_4.txt def_2_5.txt def_2_6.txt def_2_7.txt def_2_8.txt def_2_9.txt

观察def_2_12.txt之前的列表中显示def_2_1.txt。这是一个问题吗?如果是这样,我们可以明确强制数字排序。一种方法是执行bash的大括号扩展:

$ echo def_2_{1..12}.txt 
def_2_1.txt def_2_2.txt def_2_3.txt def_2_4.txt def_2_5.txt def_2_6.txt def_2_7.txt def_2_8.txt def_2_9.txt def_2_10.txt def_2_11.txt def_2_12.txt

在上文中,文件按数字顺序排列。

答案 1 :(得分:1)

也许这样的事情(假设是bash,而我没有对它进行测试)。

declare -A prefix
files=(*.txt)
for f in "${files[@]"; do
    prefix[${f%_*}]=
done
for key in "${!prefix[@]}"; do
    echo "${prefix[$key]}.txt"
done