2013-12-12 110 views
0

我有两个文件,我创建了解析其他文件并删除相关信息。其中一个文件有看起来像这样的台词:检查重复的字符串并丢弃它们?

Ahmed,Safdar:D433:181:20.40:30.00 
Gonzales,Carlos:D433:7732:18.00:24.00 
Thanhachammet,Chendrit:D500:5833:8.40:12.10 
Bush,G:D500:8343:13.00:19.00 

另一种:

343#2#8#011104 
1958#2#9#011204 
181##16#012404 
773##4#012404 

我要检查,如果冒号分隔行的第3场的井号的第一场比赛分隔线。如果是这样,我想生成一个匹配的行的列表。我有点困扰如何做到这一点。这是我尝试:T

temp=$(mktemp) 
dept=$(cut -d: -f3 "$tempDept") 
pay=$(cut -d# -f1 "$tempPay") 
if echo "$dept" | grep -w "$pay"; then 
     cat "$dept" >> "$temp" 
     cat "$pay" >> "$temp" 
fi 

回答

1

使用awk,你可以说:

awk -F'[:#]' 'FNR==NR {_[$1];next} $3 in _' pound_separated_file colon_separated_file 

您的输入,它会产生:

Ahmed,Safdar:D433:181:20.40:30.00 
+0

但是那是与上述相同的行...? – Whoppa

+0

@Whoppa你的问题说:'我想检查冒号分隔行的第三个字段是否与井号分隔行的第一个字段匹配。如果是这样,我想生成匹配哪些行的列表。如果你添加了预期的输出,它会有所帮助。 – devnull

+0

我想你是对的,那是我的错,我是个白痴。如果它们匹配,我想将冒号行中的第4个字段与磅行中的第2个字段相乘。然后将其重定向到一个文件。有没有办法让你的awk在if语句中?有点像awk;那么“$ var”= 4th:field * 2nd#field |公元前; var >>“$ file”; fi – Whoppa

1

使用join

$ cat 1 
Ahmed,Safdar:D433:181:20.40:30.00 
Gonzales,Carlos:D433:7732:18.00:24.00 
Thanhachammet,Chendrit:D500:5833:8.40:12.10 
Bush,G:D500:8343:13.00:19.00 

$ cat 2 
343#2#8#011104 
1958#2#9#011204 
181##16#012404 
773##4#012404 

$ sort -t: -k3 1 > 1a 

$ sed 's/#/:/g' 2 | sort -t: -k 1 > 2a 

$ cat 1a 
Ahmed,Safdar:D433:181:20.40:30.00 
Thanhachammet,Chendrit:D500:5833:8.40:12.10 
Gonzales,Carlos:D433:7732:18.00:24.00 
Bush,G:D500:8343:13.00:19.00 

$ cat 2a 
181::16:012404 
1958:2:9:011204 
343:2:8:011104 
773::4:012404 

$ join -t: -1 3 -2 1 1a 2a 
181:Ahmed,Safdar:D433:20.40:30.00::16:012404 
+1

在bash中,您不必为排序文件创建临时文件,您可以使用[进程替换](http://www.gnu.org/software/bash/manual/bashref.html#Process-Substitution): 'join -t:-1 3 -2 1 <(sort -t:-k3 file1)<(sed's /#/:/ g'file2 | sort -t:-k 1)' –

相关问题