Bash 用“连接多个文件”;几乎是";不同的标题
我正在尝试加入几个文件,如下所示Bash 用“连接多个文件”;几乎是";不同的标题,bash,sed,awk,Bash,Sed,Awk,我正在尝试加入几个文件,如下所示 file1 DATE;BAL_RO,ET-CAP,EXT_EA16;LRW_RT,AY-LME; 2014M01;AZ;PO; 2013M12;WT;UF; file2 DATE;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM; 2014M02;BA;LA; 2014M01;BR;ON; 我正在尝试合并它们以获得以下结果 DATE;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM;BAL_
file1
DATE;BAL_RO,ET-CAP,EXT_EA16;LRW_RT,AY-LME;
2014M01;AZ;PO;
2013M12;WT;UF;
file2
DATE;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM;
2014M02;BA;LA;
2014M01;BR;ON;
我正在尝试合并它们以获得以下结果
DATE;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM;BAL_RO,ET-CAP,EXT_EA16;LRW_RT,AY-LME;
2014M02;BA;LA;
2014M01;BR;ON;AZ;PO;
2013M12 WT;UF;
或
我尝试了join
,但它说filenameX没有排序:
如果你有任何想法,欢迎提出
最好。这对您有用吗:
$ awk '
BEGIN{FS=OFS=";"}
NR==FNR{a[$1]=$0;next}
{$0=($1 in a)?a[$1] $2 FS $3:$0; delete a[$1]}1;END{for(x in a) print a[x]}' file2 file1
DATE;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM;BAL_RO,ET-CAP,EXT_EA16;LRW_RT,AY-LME
2014M01;BR;ON;AZ;PO
2013M12;WT;UF;
2014M02;BA;LA;
- 我们将字段分隔符(输入和输出)设置为
代码>
- 我们扫描第一个文件,在第1列创建一个索引数组,并为其指定整行的值
- 第一个文件完成后,我们开始读取第二个文件。如果数组中存在第一列,则将当前行附加到数组中存储的行。我们删除数组项
- 处理完第二个文件的所有行后,我们循环遍历数组以查看是否还有剩余的项。如果是这样的话,我们就把它们打印出来李>
- Bash有一个非常好的功能,允许对两个文件进行在线排序:
$ join -t ';' -a 1 -a 2 -o 0 1.2 1.3 2.2 2.3 <(sort -n file1 ) <(sort -n file2) DATE;BAL_RO,ET-CAP,EXT_EA16;LRW_RT,AY-LME;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM 2013M12;WT;UF;; 2014M01;AZ;PO;BR;ON 2014M02;;;BA;LA
$join-t';'-a 1-a 2-o 0 1.2 1.3 2.2 2.3我想在
中添加一个空行,但是我仍然很难使用file 2.OMG进行file1
!你能解释一下吗,杰帕尔?“我需要买一个月前我答应自己要买的那本awk书,因为我今天已经拿到了报酬。”安迪克补充道。希望有帮助!问题Jaypal:如果文件有很多头文件,每个头文件都有,而不是像我在示例中所显示的那样只有3个头文件,那么它能工作吗?@AndyK它应该工作。如果你有4个或5个标题,你可以像我上面所显示的那样填充它们。如果你有100个,那么这将是乏味的,需要一个不同的方法。使用连接
迭代所有字段或for loop
删除第一个字段etcHi Gerrit,感谢您的回答。请你再解释一下好吗?我可以说1.2 1.3 2.2 2.3是列名称吗?如果是,是否意味着必须手动输入?干杯,干杯,Gerrit。这很有帮助,我想我可以自动化。在列部分,这将有点棘手,但仍然可行。我试图省略sub()
选项。根据手册,它应该给出期望的结果:-o…
,但遗憾的是,这不起作用:结果中忽略了连接字段:-(可能是默认格式输出连接字段、文件1中的剩余字段、文件2中的剩余字段,
连接中的错误)。
$ join -t ';' -a 1 -a 2 -o 0 1.2 1.3 2.2 2.3 <(sort -n file1 ) <(sort -n file2) DATE;BAL_RO,ET-CAP,EXT_EA16;LRW_RT,AY-LME;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM 2013M12;WT;UF;; 2014M01;AZ;PO;BR;ON 2014M02;;;BA;LA