我在制表符分隔文件中提供了文件名。
例如:
file1 file2 file3
file4 file5
file6 file7 file8 file9 file10
file11 file12
......等等。
我需要能够做到:
cat file1 file2 file3 > newfile1
cat file4 file5 > newfile2
cat file5 file7 file8 file9 file10 > newfile3
.....
此文件总共有140行,每行有多个文件名。在每行中我需要连接文件。每个文件名都有一个uniq名称,所以我需要将新文件命名为不同的名称。
我希望用于重命名的每个文件前缀中都有前导字符。例如,(file1)A1-2_B1.txt和(file2)A1-4_B1.txt将连接到文件A1_B1.txt
有什么建议吗?感谢所有帮助。
我知道我可以使用
(cat inputs.txt | -n 140 cat) >> newfile.txt
使用具有每个行的文件名的文件来创建单个新文件。但是,我遇到了每行多个文件的问题,无法生成多个新文件。
我想知道是否将所有输出文件名放入文本文件中,例如:
A1_B2.txt
A2_B3.txt
..etc...
并使用类似的东西:
(cat inputs.txt | cat) >> (cat outputs.txt)
是否可行。
答案 0 :(得分:2)
使用awk
将文件转换为脚本,然后通过管道传输到shell中执行:
awk '{print "cat", $0, ">", "newfile" ++c}' inputs.txt | sh
如果您有一个“输出名称”文件,该文件与行对应 输入文件,然后
awk '{getline out < "outputs.txt"; print "cat", $0, ">", out}' inputs.txt | sh
chepner的bash解决方案的另一种方法:
paste outputs.txt inputs.txt | while IFS=$'\t' read -a line; do
cat "${line[@]:1}" > "${line[0]}"
done
答案 1 :(得分:1)
i=0
while IFS=$'\t' read -a names; do
cat "${names[@]}" > "newfile$((++i))"
done < inputs.txt
应该做的伎俩。每行都被读入一个数组,该数组的内容被用作cat
的参数列表。
如果您有一个包含输出名称的单独文件:
while IFS=$'\t' read -a names;
read output <&3; do
cat "${names[@]}" > "$output"
done < inputs.txt 3< outputs.txt
答案 2 :(得分:0)
因此,使用来自chepner和glenn jackman的答案,我能够制作一个脚本来获得我所需要的。使用glenn jackman的chepners版本,我能够重命名给出outputs.txt的文件,然后我很容易地修改了chepners的原始文件,以便从输入文件中删除那些不再需要的文件。文件已经制作完成
这是两者的结合:
#!/usr/bin/bash
echo "Getting inputs and output file names:"
paste $1 $2 | while IFS=$'\t' read -a line; do
cat "${line[@]:1}" > "${line[0]}"
done
wait
echo "Removing old files"
while IFS=$'\t' read -a names; do
rm "${names[@]}"
done < $2
〜
答案 3 :(得分:0)
在许多不同的解决方案之后,另一个perl
基于:
perl -nle 'system qq{cat $_ > out$.}' < input.txt
(如果文件名不包含空格,则有效)