多次使用cut并使用多个分隔符连接结果?

时间:2015-03-17 21:45:11

标签: bash awk delimiter paste cut

如果我有文件:

c1 c2 c3 c4 c5 c6
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18 

我只希望第一,第二,第四和第五列成一行,但用不同的分隔符分隔..

例如第1行将是: 1; 2:4-5 第2行将是: 7; 8:10-11 第3行将是: 13; 14:16-17

我认为使用相同的分隔符,命令将类似于:

paste --delimiter=':' <(cut -f1 file.txt) <(cut-f2 file.txt) <(cut -f4 file.txt) <(cut -f5 file.txt)

结果应该在一个数组中,这样每一行都是数组中的一个单独的条目

IFS='\n'; echo "${array[*]}"

1;2:4-5
7;8:10-11
13;14:16-17

我认为awk可能能够做到这一点,但我无法想出来......

4 个答案:

答案 0 :(得分:3)

要使awk按照您指定的方式打印每一行,请使用

awk '{ print $1 ";" $2 ":" $4 "-" $5 }' filename

或者,要排除标题行,

awk 'NR > 1 { print $1 ";" $2 ":" $4 "-" $5 }' filename

将结果导入bash数组:

while IFS='\n' read line; do array+=("$line"); done < <(awk '{ print $1 ";" $2 ":" $4 "-" $5 }' filename)

答案 1 :(得分:1)

如果您总共有4个字段

,我猜你可以使用sed
line="1 2 3 4 5 6
> 7 8 9 10 11 12
> 13 14 15 16 17 18 "
echo "$line" | cut -f1,2,4,5 -d " " | sed 's/\([^ ]*\) \([^ ]*\) \([^ ]*\) \(.*\)/\1\;\2\:\3\-\4/g '

答案 2 :(得分:1)

使用perl

perl -lanE 'printf "%s;%s:%s-%s\n",@F[0,1,3,4]' file

打印

c1;c2:c4-c5
1;2:4-5
7;8:10-11
13;14:16-17

跳过标题

perl -lanE 'printf "%s;%s:%s-%s\n",@F[0,1,3,4] if $.>1'

答案 3 :(得分:0)

Shell脚本:

while read x ; do set - $x ; echo "$1;$2:$4-$5" ; done < filename
1;2:4-5
7;8:10-11
13;14:16-17