我会将两个文件中的数据合并到一个文件中,仅添加列中有趣的值。搜索关键字是第 3 列文件 #1 中的 UID。它还应该删除/省略 UID 重复项和空行(如果出现)。
阅读任何解释方法也将很高兴:)
FILE #1:
-----------------
SVCSTO1,dbsrv01,600507600C80012F4000000000000012
SVCSTO1,dbsrv01,600507600C80012F4000000000000014
SVCSTO1,dbsrv02,600507600C80012F40000000000001C0
SVCSTO1,dbsrv02,600507600C80012F40000000000001C1
SVCSTO1,dbsrv01,600507600C80012F40000000000001C2
SVCSTO1,winsrv01,600507600C80012F40000000000001C3
FILE #2:
-----------------
239,dbsrv01_01_T2,4398046511104,600507600C80012F40000000000001C2
240,winsrv01_03_T2,4398046511104,600507600C80012F40000000000001C3
10,dbsrv01_01_T0,0,8589934592000,600507600C80012F4000000000000014
237,dbsrv02_01_T1,4398046511104,600507600C80012F40000000000001C0
238,dbsrv02_02_T2,4398046511104,600507600C80012F40000000000001C1
8,dbsrv01_02_T0,8589934592000,600507600C80012F4000000000000012
DESIRED OUTPUT:
--------------------
SVCSTO1,dbsrv01,600507600C80012F4000000000000012,8589934592000,T0
SVCSTO1,dbsrv01,600507600C80012F4000000000000014,8589934592000,T0
SVCSTO1,dbsrv02,600507600C80012F40000000000001C0,4398046511104,T1
SVCSTO1,dbsrv02,600507600C80012F40000000000001C1,4398046511104,T2
SVCSTO1,dbsrv01,600507600C80012F40000000000001C2,4398046511104,T2
SVCSTO1,winsrv01,600507600C80012F40000000000001C3,4398046511104,T2
我能够像下面的示例一样操作数据输出,但没有经验如何构建数组或将多个输出合并为一个:(
# for i in `cat file1.log | awk -F"," '{print $3}'` ; do cat file2.log | grep $i | awk -F"," '{print $3/1024^3" GB"}'; done
8000 GB
...
答案1
这只sed
会将您的输入转换为给定的输出。您可以根据需要扩展它:
sed -E '/^[0-9]/{s/.*_(.*)(,.*),(.*)/\3\2,\1/;H;d;};G;s/,(.*)\n.*\n\1(,[0-9]*,T[0-9]*).*/\1\2/' file2 file1
此类任务的想法始终相同:首先读取第二个文件以在保留空间中构建查找表,然后将此查找表附加到主文件的每一行。
详细地:
- 该模式
/^[0-9]/
寻址以数字开头的行,因此 中的所有内容都仅{}
执行file2
s/.*_(.*)(,.*),(.*)/\3\2,\1/
从第二个文件中仅提取我们需要的部分,并且已经按照所需的顺序H;d
将其附加到保留空间中的查找表并丢弃该行。其他处理file1
仅用于G
追加查找表并s/,(.*)\n.*\n\1(,[0-9]*,T[0-9]*).*/\1\2/
查找键(在,
和换行符之间)作为\1
查找表中的反向引用以追加表中的字段
答案2
还通过 AWK 找到了其他方法来解决这个问题,并且正在为我工作。
awk -F"," 'FNR==NR{a[$4]=$3 FS $2;next}{ print $0","a[$3]}' file1 file2