2017-04-05 88 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功能。