2016-06-09 129 views
0

這實際上就是我想要的命令,除了我想在第三列中打印使用shell命令的特殊東西(或者更多awk命令我猜,但我不知道我會如何適應原來的awk語句)。我需要幫助的是print命令中$ 2和ar [$ 4,$ 1]之間的僞命令替換,但爲了特殊性而將剩下的部分留下。在必須訪問awk命令的awk腳本中使用shell命令

awk 'NR==FNR{ar[$3,$2]=$1+ar[$3,$2]; } 
    NR>FNR && ar[$4,$1] {print "hs"$1,$2,`awk '$1 == #$1 from outer awk command# file2 | tail -n 1 | awk '{print $3}'`, ar[$4,$1]}' file1 file2 

文件1的樣子

5 8  t11 
15 7  t12 
3 7  t14 

文件2的樣子

8 4520 5560 t11 
8 5560 6610 t12 
8 6610 7400 t13 
7 9350 10610 t11 
7 10610 11770 t12 
7 11770 14627 t13 
7 14627 16789 t14 

和輸出應該像

8 4520 7400 5 
7 10610 16789 15 
7 14647 16789 3 

的感謝!

+2

你在考慮這個錯誤。 Awk是一個操縱文本的工具。它不是調用工具(包括其他awk實例)的環境 - 這就是shell的用途。 [編輯]你的問題描述你想對你的輸入做什麼來創建你的輸出(而不是**你認爲你需要做什麼),所以我們可以幫助你。 –

+0

我不明白'ar [$ 4,$ 1]'可以如何返回示例輸出最後一列的值。對於這個問題,我沒有看到輸入中的任何內容可能會產生'5'和'15'的值。所以,正如EdM所說,讓我們看看關於如何處理數據的一些規則。您幾乎可以肯定地在awk中實現您的所需結果,或者重構您的shell代碼以及它如何調用awk。 **請更新您的Q **。祝你好運。 – shellter

+1

@shelter,'5'和'15'來自_file1_。 – agc

回答

2

AWK,低效殼工具代碼:

while read a b c ; do \ 
    echo -n "$b " ; \ 
    egrep "^$b " file2 | \ 
     grep -A 9999999 " $c" | \ 
     cut -d' ' -f2,3 | \ 
     sed '1{s/ .*//;t} 
      ${s/.* //;t};d' | \ 
     xargs echo -n ; \ 
    echo " $a" ; \ 
done < file1 | \ 
    column -t 

輸出:

8 4520 7400 5 
7 10610 16789 15 

主循環輸入file1的控制什麼在file2中需要被打印。 文件1有領域,所以read需要3個變量:$一個$ B,並$ C。輸出採用$ B$一個,所以這兩個變量來「免費」 - 主循環的第一個和最後一個行,(兩者echo小號),前綴$ B和後綴$ a到每行中間的兩個數字。

egrep打印文件2線與$ B開始,但這些線路,我們只想要$ C結束一加後,該線,這是什麼打印出grep -A ...。只需要中間兩列,所以cut只打印這些列。現在我們有一個兩列數字塊,我們只想要sed代碼打印的左上角或右下角...

任何sed代碼在運行時自動計算行數。當sed遇到第一行行時,它會運行第一組大括號中的內容('1{<代碼>}')。如果失敗sed檢查它是否在最後線($意味着最後一行),如果sed運行什麼是在第二組大括號,('${<代碼>}')。如果不是第一行或最後一行sed將其刪除。

裏面那些大括號:s/ .*//就像cut -f 1會。關閉t意味着'GOTO標籤',但是當沒有'標籤'sed剛剛開始一個新的循環時,讀取另一行 - 沒有t,代碼將運行d,並且什麼都不打印。隨着兩個領域,s/.* //作品像cut -f 2

主要while每次循環都sed打印號碼,但每個都在它自己的路線。對xargs echo -n進行配管將兩個數字放在同一行上,因爲打印了$ b

+0

謝謝你,我意識到我輸入了一個我的輸入文件錯誤,但它應該在第3列t12而不是t11開始於7,以便輸出10610在第二列第二行(那部分在那裏)你知道如何相應地調整這個代碼 – Jacob

+0

當我運行這個時,我得到了sed:1:「1 {s /。* // ; t}; $ {s /.* //; ...「:意外的EOF(正在執行)'),並且我不太熟悉sed – Jacob

+0

複製整個塊,然後將其__立刻粘貼到命令行,它應該工作。 – agc