希望有人可以教我如何完成这项任务。
我在想awk可能会很好,但我真的很初学。
我有一个像下面这样的文件(标签分隔,实际文件要大得多)。 这里,重要的列是第二和第九列(文件第一行中的235和15)。
S 235 1365 * 0 * * * 15 1 c81 592
H 235 296 99.7 + 0 0 3I296M1066I 14 1 s15018 1
H 235 719 95.4 + 0 0 174D545M820I 15 1 c2664 10
H 235 764 99.1 + 0 0 55I764M546I 15 1 c6519 4
H 235 792 100 + 0 0 180I792M393I 14 1 c407 107
S 236 1365 * 0 * * * 15 1 c474 152
H 236 279 95 + 0 0 765I279M321I 10-1 1 s7689 1
H 236 301 99.7 - 0 0 908I301M156I 15 1 s8443 1
H 236 563 95.2 - 0 0 728I563M74I 17 1 c1725 12
H 236 97 97.9 - 0 0 732I97M536I 17 1 s11472 1
我想通过指定第九列的值来提取行。此时,第二列将像枢轴列。我的意思是枢轴列,如果第二列具有相同的值,则将其视为单个数据集。在这组行中,所有行都需要在第九列中具有特定值。
因此,例如,如果我指定第9列" 14"和" 15"。然后出去就会。
S 235 1365 * 0 * * * 15 1 c81 592
H 235 296 99.7 + 0 0 3I296M1066I 14 1 s15018 1
H 235 719 95.4 + 0 0 174D545M820I 15 1 c2664 10
H 235 764 99.1 + 0 0 55I764M546I 15 1 c6519 4
H 235 792 100 + 0 0 180I792M393I 14 1 c407 107
第6和第8行有" 15"在他们的第九栏中,但是"中的其他一行" (由第二列指定:236)具有除" 14"之外的值。或" 15",所以我不想提取线条。
答案 0 :(得分:2)
$ cat tst.awk
$2 != prevPivot { prtCurrSet() }
$9 !~ /^1[45]$/ { isBadSet=1 }
{ currSet = currSet $0 ORS; prevPivot = $2 }
END { prtCurrSet() }
function prtCurrSet() {
if ( !isBadSet ) {
printf "%s", currSet
}
currSet = ""
isBadSet = 0
}
$ awk -f tst.awk file
S 235 1365 * 0 * * * 15 1 c81 592
H 235 296 99.7 + 0 0 3I296M1066I 14 1 s15018 1
H 235 719 95.4 + 0 0 174D545M820I 15 1 c2664 10
H 235 764 99.1 + 0 0 55I764M546I 15 1 c6519 4
H 235 792 100 + 0 0 180I792M393I 14 1 c407 107
答案 1 :(得分:1)
不完全确定完整的要求,看到您的预期输出,请您试试。
awk '$2 == 235 && ($9 == 14 || $9 == 15)' Input_file
输出如下。
S 235 1365 * 0 * * * 15 1 c81 592
H 235 296 99.7 + 0 0 3I296M1066I 14 1 s15018 1
H 235 719 95.4 + 0 0 174D545M820I 15 1 c2664 10
H 235 764 99.1 + 0 0 55I764M546I 15 1 c6519 4
H 235 792 100 + 0 0 180I792M393I 14 1 c407 107
答案 2 :(得分:1)
短 awk 表达式:
Impact, Likelihood
awk '$2==235 && $9~/^1[45]$/' file
- 确保第9个字段与$9~/^1[45]$/
或14
匹配