2016-09-17 64 views
-2
name1 20160801|76 20160802|67 20160803|49 20160804|35 20160805|55 20160806|76 20160807|77 20160808|70 2016089|50 20160810|75 20160811|97 20160812|90 20160813|87 20160814|99 20160815|113 20160816|83 20160817|57 20160818|158 20160819|61 20160820|46 20160821|1769608 20160822|2580938 20160823|436093 20160824|75 20160825|57 20160826|70 20160827|97 20160828|101 20160829|96 20160830|95 20160831|89 
name2 20160801|32413 20160802|37707 20160803|32230 20160804|31711 20160805|32366 20160806|35532 20160807|36961 20160808|45423 2016089|65230 20160810|111078 20160811|74357 20160812|71196 20160813|71748 20160814|77001 20160815|91687 20160816|92076 20160817|89706 20160818|126690 20160819|168587 20160820|207128 20160821|221440 20160822|234594 20160823|200963 20160824|165231 20160825|139600 20160826|145483 20160827|209013 20160828|228550 20160829|223712 20160830|217959 20160831|169106 

我在文件中有兩行的行位置,如line1和line2。這些行可能在文件中的任何位置,但我可以使用基於每行中的名稱(第一個單詞)的搜索關鍵字訪問行位置使用awk比較文件中兩行的相應值

20160801表示yyyymmdd並具有由| 我需要比較與給定兩行的每個日期相關的值。

我是awk中的新手。我不理解如何在同一時間比較這兩條線。

+1

我不理解。 1)每個文件都有'name1'和'name2'唯一值嗎?即每個文件中多於1個?你只需要在文件1中找到name1並在文件2中找到名稱2並比較每行中的日期字符串? – dawg

+0

名稱1 name2在整個文件中將是唯一的。每行有31天。下一天是當天管道價值。我需要比較兩行中日期的相應值。每行有一個給定月份的31天。所以日期和他們的位置是相同的文件 – joe

+1

比較和做什麼?你的預期產出是多少? – karakfa

回答

0

你的問題並不十分清楚。或許第一步是明確表達1)我正在努力解決什麼問題; 2)我需要什麼工具或數據來解決它?

具體到你的問題,我可以提供(因爲您的問題聲明沒有明確說明),唯一的線索是這些:

  1. 在awk中,您可以通過使用測試FNR==NR這是比較兩個不同的文件只有在第一個文件上纔是真的。

  2. 可以使用,這意味着與該模式啓動線的形式/^name1/的正則表達式找到的關鍵詞

  3. 可以在一個定界符在AWK通過設置字段分隔到定界符分割 - - 在這種情況下(我認爲)這聽起來像是|,但你也在比較這些字段內的空格分隔的字段?

  4. 您可以通過保存第一行的數據並與其他文件中第二行的數據進行比較,一旦您可以清楚說明「比較」對您意味着什麼,即可進行比較。

結束語說起來,給出:

$ cat /tmp/f1.txt 
name1 20160801|76 20160802|67 20160803|49 20160804|35 20160805|55 20160806|76 20160807|77 20160808|70 2016089|50 20160810|75 20160811|97 20160812|90 20160813|87 20160814|99 20160815|113 20160816|83 20160817|57 20160818|158 20160819|61 20160820|46 20160821|1769608 20160822|2580938 20160823|436093 20160824|75 20160825|57 20160826|70 20160827|97 20160828|101 20160829|96 20160830|95 20160831|89 
$ cat /tmp/f2.txt 
name2 20160801|32413 20160802|37707 20160803|32230 20160804|31711 20160805|32366 20160806|35532 20160807|36961 20160808|45423 2016089|65230 20160810|111078 20160811|74357 20160812|71196 20160813|71748 20160814|77001 20160815|91687 20160816|92076 20160817|89706 20160818|126690 20160819|168587 20160820|207128 20160821|221440 20160822|234594 20160823|200963 20160824|165231 20160825|139600 20160826|145483 20160827|209013 20160828|228550 20160829|223712 20160830|217959 20160831|169106 

你可以找到像這樣有問題的線路:

$ awk -F"|" '/^name/ && FNR==NR {print $1}' f1.txt f2.txt 
name1 20160801 
$ awk -F"|" '/^name/ && FNR<NR {print $1}' f1.txt f2.txt 
name2 20160801 

(我只印爲清晰起見,第一場)

然後用它來比較。將第一個保存在關聯數組中,然後在找到時比較第二個數組。