2014-09-04 70 views
-3

我需要幫助來創建基於兩個文件的數據的第三個文件。其中兩個文件具有相同數量的記錄,並且每個文件中的數據彼此對應。使用兩個文件創建第三個文件

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) 

以上是有可能在源文件中更多的數據爲例,任何幫助將不勝感激。

+2

你到目前爲止試過了什麼?請閱讀[FAQ]和[Ask]。你需要努力自己解決問題,展示你的嘗試,並解釋問題。 – 2014-09-04 18:10:07

回答

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

有趣的是,您爲getline版本從'condition {x = y} print x'更改爲'print(condition?y:x)'。這兩種方法都沒有錯,只是有趣的你改變了。 FWIW如果你必須使用getline,最好測試它的結果,所以'awk'(getline type <「datatype.txt」)> 0 {print ...}'。否則,它可能會失敗並將'type'設置爲之前的值,並且您會得到預期的行數輸出,但最後N行會損壞,並且永遠不知道您是否沒有密切關注。我可能會考慮一個'paste file1 file2 | awk' getline之前的解決方案,但YMMV。 – 2014-09-04 19:14:02

+1

@EdMorton好點,對不起,我不得不趕緊參加一個會議,所以剛剛寫下了曾經來到我頭上的東西。 ':P'。我會更新答案以包含您的建議。再次感謝!。 – 2014-09-04 19:17:35

+1

謝謝你們,我現在能夠得到一個有性別的數據。 欣賞它很多。乾杯! – user3754136 2014-09-05 05:15:34

0

只是open這兩個文件。如果第二個文件中的行是「DATE」(不要忘記爲chomp),則輸出"CHAR($line2)",否則輸出(print)僅爲$line1,請逐行讀取它們(readline)。

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) 
相關問題