打印所有列,但首先按pattern,bash分隔

时间:2014-04-24 20:21:45

标签: bash shell

大家好日子,

我想知道如何打印所有列,但首先是每列都由;分隔。

示例:

abc; def; ghi; jkl

获取:

def; ghi; jkl

到目前为止,我已经完成了

awk 'BEGIN { FS = ";" } ; {for(i=2;i<NF;i++)printf "%s",$i OFS; if (NF) printf "%s",$NF; printf ORS}'

非常感谢你提出任何线索。

4 个答案:

答案 0 :(得分:5)

只需使用cut

cut -f2- -d\; filename.txt

如果您的输入来自stdin:

echo "abc; def; ghi; jkl" | cut -f2- -d\;

答案 1 :(得分:2)

如果您知道它将始终以空格分隔:

echo "abc; def; ghi; jkl" | while read ignore line ; do echo $line ; done

while read部分可以带有多个参数:ignore在这种情况下将采用第一个分段,直到第一个分隔符(意思是&#34; abc;&#34;) ,任何未被读取的内容都被放入其余的论点中。在这种情况下,它是line,因此line将包含&#34; def; ghi; jkl&#34;你打印出来的。

echo "abc; def; ghi; jkl" | while read first second third ; do echo $first; echo $second; echo $third; done

将输出

abc;
def;
ghi; jkl

修改

如果您知道它将由其他标记分隔,则可以更改IFS值:

IFS=";" ; echo "abc; def; ghi; jkl" | while read first second third ; do echo $first; echo $second; echo $third; done

产生

abc
 def
 ghi  jkl

(注意defghi之前的空格。

答案 2 :(得分:2)

bash函数:

$ myshift() {
   local IFS=';'
   set -- $1
   shift
   echo "$*"
}

$ myshift "abc; def; ghi; jkl"
 def; ghi; jkl

答案 3 :(得分:1)

只为了awk的乐趣:

$ echo "abc; def; ghi; jkl"|awk -F "; " '{$1=""; gsub("^ +", "", $0); print}'
def; ghi; jkl

使用sed

$ echo "abc; def; ghi; jkl"|sed "s/^[^;]\{1,\};\ \{1,\}//g"
def; ghi; jkl

正如您所看到cut版本在行的开头打印空格;)

$ echo "abc; def; ghi; jkl"|cut -d";" -f2-
 def; ghi; jkl

所以你也可以尝试类似的东西:

$ echo "abc; def; ghi; jkl"|cut -d";" -f2-|xargs
def; ghi; jkl