【发布时间】:2015-04-14 13:16:31
【问题描述】:
我有两个文件,文件A和文件B。文件A的结构如下图所示:
3314530275|76|1|20240422045006|
3335984469|64|2|20150804235959|
3367892381|203|3|20141025235959|
3369039388|203|4|20131219235959|
第二个文件B的内容如下:
3314530275|2000|999000000073101614|0|20370101000000|76|
3314530275|2000|999000000073101614|0|20370101000000|76|
3369039388|2000|812000002628721|-112|20360101235959|203|
3335984469|5037|5210367877660|180|20150213000000|64|
3335984469|5048|5210367877661|6|20150213000000|64|
3335984469|2000|812000002629182|1913|20360101235959|64|
3367892381|5014|5210365185964|419430400|20150308000000|203|
3367892381|5044|5210365185965|226020|20150308000000|203|
3367892381|2000|817000102009605|0|20360101235959|203|
脚本应该首先检查文件A,如果第三个字段($3)等于2,它应该存储第一列($1)和第四列($4)的值。
之后它将检查我们在第一步中存储的值中是否存在(第二个文件的)$1 值。
-
如果值存在并且第二个字段等于 2000,它应该打印 $1,$2,$4,(我们从第一个文件中获取并存储它的第四列的值)
如果值存在且第二个字段不等于 2000,则应打印 $1,$2,$4,$5
上述案例中的示例输出:
3335984469|5037|180|20150213000000|
3335984469|5048|6|20150213000000|
3335984469|2000|1913|20150804235959|
这是我目前所拥有的:
awk -F \| 'FNR==NR {if($3 == 2) a[$1] = $4; next} ($1 in a) {if($2==2000) print$1"|"$2"|"$4"|"a[$1]"|"} ($1 in a) {if($2!=2000) print$1"|"$2"|"$4"|"$5"|"} ' FileA FileB > Output_File
任何帮助将不胜感激。
【问题讨论】:
-
到目前为止你有什么收获?
-
我现在已经想出了这个,但我不确定是否正确使用代码,因为输出似乎缺少很多应该存在的值-------- ------- awk -F \| 'FNR==NR {if($3 == 2) a[$1] = $4;下一个} ($1 in a) {if($2==2000) print$1"|"$2"|"$4"|"a[$1]"|"} ($1 in a) {if($2!=2000) print $1"|"$2"|"$4"|"$5"|"} ' FileA FileB > Output_File
-
我正在寻找的是实现相同目标的另一种方法!我的脚本适用于值样本,但是当我在大文件上使用它时,结果不一样
-
它看起来应该可以工作,除非你在文件 A 中有重复的
$1。你在文件 A 中有重复的第一个字段吗? -
@MuhammadAbdullah,看起来不错。我要做的唯一更改是将
if和else折叠到同一个块中:$1 in a {if ($2 == 2000) print $1,$2,$4,a[$1],""; else print $1,$2,$4,$5,""}——暗示OFS="|"