2011-12-19 29 views
0

也許這不是最好的標題;但很難用簡短的標題來表達我的意圖。將變量合併到bash代碼行中

我在這裏的行:

2 118610455 P2_PM_2_5034 T <DUP:TANDEM> 40 . END=118610566;SVLEN=110;SVTYPE=TDUP;CIPOS=-100,55;CIEND=-56,100;IMPRECISE;DBVARID=esv7540;VALIDATED;VALMETHOD=CGH;SVMETHOD=RP 

基本上我想它轉換成:

2 118610455 118610566 

所以主要問題是從第8列的grep這個118610566

我知道如何用grep這個數字:

$c=`cat line|awk '{print $8}'|sed 's/;/\t/g'|awk '{print $1}'|sed 's/\END=//g'` 

,但我的問題是,那麼我怎麼可以將這個變量到另一個慶典線:

what_i_want=`cat line|awk '{print $1"\t"$2"\t"$c}'` 

THX

回答

1

一個小字符串操作,你可以一口氣拿到它。

what_i_want=$(awk '{sub(/^END=/,"",$8); sub(/;.*$/,"",$8); print $1,$2,$8}' line) 

一些說明:在可變c

sub(a,b,c)搜索圖案a並用b替換它,存儲修改後的字符串返回到c。模式寫在//之內。

^是字符串的開頭,$是結束時,.是什麼,和*表示零或多個前述圖案。因此,在我們的例子:

sub(/^END=/,"",$8);比賽END=在字符串的開頭(^),並與"",沒有什麼替代它,基本上是將其刪除。

sub(/;.*$/,"",$8);將從;到($)的所有內容(.*)都取出並刪除它。請注意,在awk中,與大多數正則表達式引擎一樣,*貪婪,這意味着它需要最長的匹配,所以我們知道這將得到第一個;

而我們剩下的就是你想要的數字。

+0

thx很好......但你能否解釋一下sub(/;.*/,"",$$ 8)?我知道在這裏截斷了部分;對?但我不明白是什麼。 *表示這裏。 – user815408 2011-12-19 22:07:47

+0

添加了解釋。 – Kevin 2011-12-19 22:21:22

3

可能這可以幫助 -

[jaypal:~/Temp] cat tmp 
2 118610455 P2_PM_2_5034 T <DUP:TANDEM> 40 . END=118610566;SVLEN=110;SVTYPE=TDUP;CIPOS=-100,55;CIEND=-56,100;IMPRECISE;DBVARID=esv7540;VALIDATED;VALMETHOD=CGH;SVMETHOD=RP 

[jaypal:~/Temp] var=$(awk -v FS="[ ;=]" '{print $1,$4,$24}' tmp) 

[jaypal:~/Temp] echo $var 
2 118610455 118610566 

FSawk's內置變量。它默認爲空格或製表符。由於您的行作爲多個分隔符,因此將FS設置爲字符類有助於爲每個解除限制器分割行。我們在這裏定義的字符類是space,semi-colonequal

可能會覺得有點奇怪,但是當我碰巧用一個以上的分隔符分析一行時,我將它用作識別列的調試工具。這是我從你的線了 -

[jaypal:~/Temp] awk -v FS="[ ;=]" '{for(i=1;i<=NF;i++) print "$"i" is "$i}' tmp 
$1 is 2 
$2 is 
$3 is 
$4 is 118610455 
$5 is 
$6 is 
$7 is P2_PM_2_5034 
$8 is 
$9 is 
$10 is 
$11 is T 
$12 is 
$13 is 
$14 is <DUP:TANDEM> 
$15 is 
$16 is 
$17 is 
$18 is 40 
$19 is 
$20 is . 
$21 is 
$22 is 
$23 is END 
$24 is 118610566 
$25 is SVLEN 
$26 is 110 
$27 is SVTYPE 
$28 is TDUP 
$29 is CIPOS 
$30 is -100,55 
$31 is CIEND 
$32 is -56,100 
$33 is IMPRECISE 
$34 is DBVARID 
$35 is esv7540 
$36 is VALIDATED 
$37 is VALMETHOD 
$38 is CGH 
$39 is SVMETHOD 
$40 is RP 

您也可以通過以下方式使用awk簡單substr內置功能 -

[jaypal:~/Temp] awk '{print $1,$2,$8=substr($8,5,9)}' tmp 
2 118610455 118610566 
+0

thx但你能解釋一下FS =「[; =]」有點嗎?我不知道爲什麼11861045成爲第4列。 – user815408 2011-12-19 22:00:41

0

如果你的「列」總是分開由空格,那麼你就需要使用子shell和awk,可以在外殼直接做到這一點:

[[email protected] ~]$ read one two three four five junk <<< "2 118610455 P2_PM_2_5034 T <DUP:TANDEM> 40 . END=118610566;SVLEN=110;SVTYPE=TDUP;CIPOS=-100,55;CIEND=-56,100;IMPRECISE;DBVARID=esv7540;VALIDATED;VALMETHOD=CGH;SVMETHOD=RP" 
[[email protected] ~]$ echo "$five" 
<DUP:TANDEM> 
[[email protected] ~]$ echo "$junk" 
40 . END=118610566;SVLEN=110;SVTYPE=TDUP;CIPOS=-100,55;CIEND=-56,100;IMPRECISE;DBVARID=esv7540;VALIDATED;VALMETHOD=CGH;SVMETHOD=RP 

您指定的最後一個變量3210線獲得「其他」。

另外。如果你正在處理這樣的多行,你可以在一個循環中運行它:

cat /path/to/inputfile | while read one two three four five junk; do 
    echo "$one - $two - $five" 
done 

鹽的味道。