【问题标题】:use two files to create a third file使用两个文件创建第三个文件
【发布时间】:2014-09-04 18:07:33
【问题描述】:

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

Fields.txt 的数据如下

Field1
DEST_1
TEMPS
FLAGS

Datatype.txt 的数据如下

INTEGER
CHAR
DATE
DATE

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

Field1
DEST_1
CHAR(TEMPS)
CHAR(FLAGS)

以上是一个示例,源文件中可能有更多数据,任何帮助将不胜感激。

【问题讨论】:

  • 到目前为止您尝试过什么?请阅读FAQHow to Ask。您应该努力自己解决问题,展示您的尝试并解释问题。

标签: regex perl shell awk sed


【解决方案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 的另一种方式,如下面的cmets 中Ed Morton 所建议的那样。

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

【讨论】:

  • 有趣的是,您将 getline 版本从 condition {x=y} print x 更改为 print (condition ? y : x)。这两种方法都没有错,只是有趣的是你改变了。 FWIW 如果你必须使用 getline,最好测试它的结果,所以awk '(getline type &lt; "datatype.txt") &gt; 0 {print...}。否则它可能会失败并将type 设置为之前的值,您将获得预期的输出行数,但最后 N 行已损坏,并且永远不知道您是否没有密切注意。我可能会在 getline 但 YMMV 之前考虑 paste file1 file2 | awk 解决方案。
  • @EdMorton 好点,是的,很抱歉我不得不匆忙参加会议,所以只写了我最先想到的内容。 :P。我将更新答案以包含您的建议。再次感谢!
  • 谢谢各位,我现在可以得到预期的数据了。非常欣赏它。干杯!!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    并行读取文件:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多