使用两个文件来创建第三个文件

时间:2014-09-04 18:07:33

标签: regex perl shell awk sed

我需要帮助才能根据两个文件的数据创建第三个文件。其中两个文件具有相同数量的记录,每个文件中的数据彼此对应。

Fields.txt的数据如下

Field1
DEST_1
TEMPS
FLAGS

Datatype.txt包含以下数据

INTEGER
CHAR
DATE
DATE

我需要帮助任何将检查datatype.txt文件中的数据类型的脚本,如果它与DATE匹配,将使用fields.txt创建第3个文件,并且应该格式化相应的字段。我期待第三个文件中的数据如下

Field1
DEST_1
CHAR(TEMPS)
CHAR(FLAGS)

上面是一个示例,源文件中可能有更多数据,任何帮助都将受到赞赏。

3 个答案:

答案 0 :(得分:1)

使用awk

$ awk '
NR==FNR { type[NR] = $0; next }
        { print (type[FNR]=="DATE" ? "CHAR(" $0 ")" : $0) }
' datatype.txt fields.txt
Field1
DEST_1
CHAR(TEMPS)
CHAR(FLAGS)

读取以行号索引的内存中的文件datatype.txt。在阅读fields.txt文件时,检查数组值是否为DATE。如果是用您想要的输出替换线。

这需要将文件datatype.txt保留在内存中。如果文件太大,则有另一种方法可以并行读取这两个文件。

$ awk '
(getline type < "datatype.txt") > 0 {
    print (type=="DATE" ? "CHAR(" $0 ")" : $0)
}' fields.txt
Field1
DEST_1
CHAR(TEMPS)
CHAR(FLAGS)

此解决方案需要使用getline。投资前请仔细阅读offer document

以下是使用pasteawk建议的另一种方式,如Ed Morton所示。

$ paste datatype.txt fields.txt | awk '{ print ($1=="DATE" ? "CHAR(" $2 ")" : $2)}'
Field1
DEST_1
CHAR(TEMPS)
CHAR(FLAGS)

答案 1 :(得分:0)

只有open这两个文件。如果第二个文件中的行是“DATE”(不要忘记readline),请输出"CHAR($line2)",否则输出({{3},逐行读取它们(chomp) }})只是$line1

答案 2 :(得分:0)

并行读取文件:

use strict;
use warnings;
use autodie;

#open my $fh1, '<', 'Fields.txt';
open my $fh1, '<', \ "Field1\nDEST_1\nTEMPS\nFLAGS\n";

#open my $fh2, '<', 'Datatype.txt';
open my $fh2, '<', \ "INTEGER\nCHAR\nDATE\nDATE\n";

while (!eof($fh1) && !eof($fh2)) {
    chomp(my $line1 = <$fh1>);
    chomp(my $line2 = <$fh2>);

    print $line2 eq 'DATE' ? "CHAR($line1)\n" : "$line1\n";
}

输出:

Field1
DEST_1
CHAR(TEMPS)
CHAR(FLAGS)