awk - 仅在第一次出现时分割

时间:2013-10-03 09:00:21

标签: bash awk

我有一句话:

one:two:three:four:five:six seven:eight

我想使用awk$1成为一个而$2成为two:three:four:five:six seven:eight

我知道我之前可以通过sed来获得它。这是使用新分隔符更改:第一次出现sed然后awk

然而,用新的分隔符替换分隔符对我没有帮助,因为我不能保证新的分隔符不会在文本中的某个位置。

我想知道是否有让awk以这种方式行事的选项

类似于:

awk -F: '{print $1,$2}'

将打印:

one two:three:four:five:six seven:eight

我还想对$1$2进行一些操作,所以我不想只替换:的第一次出现。

3 个答案:

答案 0 :(得分:18)

没有任何替换

echo "one:two:three:four:five" | awk -F: '{ st = index($0,":");print $1 "  " substr($0,st+1)}'

index命令在整个字符串中找到“:”的第一个出现,所以在这种情况下,变量st将被设置为4.然后使用substr函数从位置开始抓取所有其余的字符串st + 1,如果没有提供结束号,它将转到字符串的末尾。输出

one  two:three:four:five

如果要进一步处理,可以始终将字符串设置为变量以进行进一步处理。

rem = substr($0,st+1)

请注意,这是在Solaris AWK上测试的,但我看不出为什么这不适用于其他版本的任何原因。

答案 1 :(得分:4)

有人这样吗?

echo "one:two:three:four:five:six" | awk '{sub(/:/," ")}1' 
one two:three:four:five:six

这会将第一个:替换为空格。 然后你可以把它变成$ 1,$ 2

echo "one:two:three:four:five:six" | awk '{sub(/:/," ")}1' | awk '{print $1,$2}'
one two:three:four:five:six

或者在同一个awk中,即使使用替换,你也可以按照自己喜欢的方式获得1美元和2美元

echo "one:two:three:four:five:six" | awk '{sub(/:/," ");$1=$1;print $1,$2}'
one two:three:four:five:six

编辑: 使用不同的分隔符,您可以首先one提交$1并在$2中停留,如下所示:

echo "one:two:three:four:five:six seven:eight" | awk -F\| '{sub(/:/,"|");$1=$1;print "$1="$1 "\n$2="$2}'
$1=one
$2=two:three:four:five:six seven:eight

唯一分隔符

echo "one:two:three:four:five:six seven:eight" | awk -F"#;#." '{sub(/:/,"#;#.");$1=$1;print "$1="$1 "\n$2="$2}'
$1=one
$2=two:three:four:five:six seven:eight

答案 2 :(得分:2)

你最接近的是GNU awk的FPAT

$ awk '{print $1}' FPAT='(^[^:]+)|(:.*)' file
one

$ awk '{print $2}' FPAT='(^[^:]+)|(:.*)' file
:two:three:four:five:six seven:eight

$2将包含主要分隔符,但您可以使用substr来解决此问题:

$ awk '{print substr($2,2)}' FPAT='(^[^:]+)|(:.*)' file
two:three:four:five:six seven:eight

所以把它们放在一起:

$ awk '{print $1, substr($2,2)}' FPAT='(^[^:]+)|(:.*)' file
one two:three:four:five:six seven:eight

substr的结果存储回$2将允许在没有前导分隔符的$2上进一步处理:

$ awk '{$2=substr($2,2); print $1,$2}' FPAT='(^[^:]+)|(:.*)' file
one two:three:four:five:six seven:eight

应与mawk 1.3.3合作的解决方案:

awk '{n=index($0,":");s=$0;$1=substr(s,1,n-1);$2=substr(s,n+1);print $1}' FS='\0'
one

awk '{n=index($0,":");s=$0;$1=substr(s,1,n-1);$2=substr(s,n+1);print $2}' FS='\0'
two:three:four five:six:seven

awk '{n=index($0,":");s=$0;$1=substr(s,1,n-1);$2=substr(s,n+1);print $1,$2}' FS='\0'
one two:three:four five:six:seven