我对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脚本中编写代码,感谢任何帮助。
答案 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