2017-04-05 29 views
1

首先,我想提前感謝各位,希望能成爲某一天的一部分。所以我有一個文件,它是長度爲5個參數的行的列表。如「剪切」命令的多位置參數分配

Bob:Wilson:Nebraska:34:yes 

我需要寫在BASH一個程序,讓我查看標準出來放水平,並會允許我這樣稱呼文本文件中的行狀

$sh filename.sh 1 
Bob 
Tom 
Dave 
etc.. 

$sh filename.sh 1 3 4 2 
Bob:Nebraska:34:Wilson 
Tom:Iowa:27:Anderson 
etc.. 

我至今寫的是

cut -d : -f$1,$2,$3,$4,$5 somefile.txt | paste -s 

的問題是,如果用戶SH filename.sh後提出,在不到5個參數,我得到一個錯誤代碼。用戶不需要輸入5,但可以調用最多5個。

回答

0

awk來救援!

awk -F: -v c="$1 $2 $3 $4 $5" 'BEGIN {n=split(c,a," ")} 
            {for(i=1;i<n;i++) printf "%s", $a[i] FS; 
             printf "%s\n", $a[n]}' file 

試着讓我知道你是否需要澄清。

+0

我看到使用過「awk」很多回答關於該主板這些問題(我一直在爬了一段時間),但我們還沒有掩蓋它的類,所以我不熟悉它足夠用了,但感謝你非常喜歡你的輸入!我在網上學習這一點,它留下了很多不足之處。 – Grunt

0

僅擴展現有參數

IFS=, 
cut -d : -f"$*" somefile.txt 

$*擴展到1st parameter$IFS2nd parameter$IFS ... $IFSlast parameter,即$1,$2如果兩個參數分別給予,$1,$2,$3如果三個分別給予,等等。

允許從上述重新排列

該命令具有一個問題:cut不能重新排列的列。 cut -f1,2相當於cut -f2,1。請參閱rearrange columns using cut。因此我們改用awk

如果參數爲filename.sh 1 3 4 2,那麼我們就需要以下awk命令:

awk -F: -v OFS=: '{ print $1, $3, $4, $2 }' somefile.txt 

-F將字段設置爲分隔符讀取文件。 -v OFS=:設置輸出的字段分隔符。 print $1, $3, ...表示»打印第一個字段,然後第三個,...«。請注意,'$1'而不是腳本的第一個參數,但是是由awk解釋的文字字符串。

我們使用與之前相同的技巧從給定的參數構建awk命令。

IFS=, 
awk -F: -v OFS=: "{ print ${*/#/$} }" somefile.txt 

${*/#/$}預規劃$每個參數。擴展將爲$1st parameter,$2nd parameter, ... ,$last parameter

+0

我忘了加上」謝謝 – Grunt

+0

您的腳本不給請求的輸出。當所謂的'./script 1 3 4 2'它會輸出'鮑勃。威爾森:內布拉斯加州:34',而不是'鮑勃:內布拉斯加州: 34:Wilson'。 –

+0

'cut'無法改變字段的順序。請參閱[這個問題](http://stackoverflow.com/q/2129123/6770384)。由於Grunt主要詢問參數而不是實際切割I認爲不適合他/她的問題。但是,你是對的,我應該解決這個問題。 – Socowi

0

就個人而言,我總是會避免使用shell腳本進行文本處理。有更好的工具,如sed,awkperl等等。這是因爲,這似乎是你在找什麼,因爲我會怎麼做純慶典(*):

#!/bin/bash 
#file: script.sh 

for line in $(<somefile.txt); do 
    array=(${line//:/ }) 
    counter=1 
    for elem in [email protected]; do 
     echo -n "${array[$elem-1]}" 
     [ $counter -ne $# ] && echo -n ":" 
     ((counter++)) 
    done 
    echo 
done 

(*):不要被語法高亮,這$#後承認一切混淆作爲評論(灰色文本)。在示例腳本中,它在語法上都是正確的。

說明:

的腳本讀取somefile.txt,分割在陣列array:字符,並存儲所得到的字段/元素的每一行。然後它按照腳本參數([email protected])指定的順序輸出字段。

這裏是輸出,你到底怎麼想的那樣:

$ ./script.sh 1 
Bob 
Tom 

$ ./script.sh 1 3 4 2 
Bob:Nebraska:34:Wilson 
Tom:Iowa:27:Anderson 

還要注意以下幾點:

在您的例子,你可能執行與Bourne外殼腳本(sh),而不是bash。但上面的腳本需要bash,因爲它使用substring replacement功能。