2017-09-14 50 views
-1

希望有人能教我如何完成這項任務。使用兩個標準提取線

我想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 

我想通過指定第九列的值來提取行。在這個時候,第二列將像樞軸柱一樣。我的意思是樞軸列,如果第二列具有相同的值,則將其視爲一組數據。並且在一組行中,所有行都需要在第九列中具有特定值。

因此,例如,如果我指定第九列「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 

第六和第八線具有「15」在它們的第九列,但其它線路中的「設置」(由第二列指定:236)具有其它值不是「14」或「15」,所以我不想提取線條。

回答

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 
+0

嗨,Ed,我想問一個更多的條件。我想提取包含我在第九列指定的所有值的Pivot行集。我沒有在上面的例子中顯示,但是,使用當前的腳本,一些中心線集只有14或15。你會教我如何做到這一點? – user2182606

+0

當然,用它自己的樣本輸入/輸出/需求發佈一個新問題。 –

+0

我將在幾分鐘內準備一個新問題。 – user2182606

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 
1

AWK表達:

awk '$2==235 && $9~/^1[45]$/' file 

  • $9~/^1[45]$/ - 確保了第九字段匹配任一1415