文件名为.tsv的cat文件

时间:2014-07-24 15:53:24

标签: bash text-files filenames cat

我在制表符分隔文件中提供了文件名。

例如:

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)

是否可行。

4 个答案:

答案 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

(如果文件名不包含空格,则有效)