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

Udy*_*Udy 13 bash awk

我有一句话:

one:two:three:four:five:six seven:eight
Run Code Online (Sandbox Code Playgroud)

我想用awk获得 $1是一个$2two:three:four:five:six seven:eight

我知道我以前可以做到这一点sed.这是改变的第一次出现:sed那么awk它使用新的分隔符.

但是,用新的分隔符替换分隔符对我没有帮助,因为我无法保证新的分隔符不会在文本中的某个位置.

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

所以类似于:

awk -F: '{print $1,$2}'
Run Code Online (Sandbox Code Playgroud)

将打印:

one two:three:four:five:six seven:eight
Run Code Online (Sandbox Code Playgroud)

我也想做一些操作$1,$2所以我不想只替换第一次出现:.

Adr*_*ian 21

没有任何替代

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

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

one  two:three:four:five
Run Code Online (Sandbox Code Playgroud)

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

rem = substr($0,st+1)
Run Code Online (Sandbox Code Playgroud)

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

  • 我可能需要睡一会儿:) (2认同)

Jot*_*tne 5

有些像这样?

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

这取代了第一个:空间。然后你可以稍后把它变成 1 美元,2 美元

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

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

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

编辑:使用不同的分隔符,您可以首先获得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
Run Code Online (Sandbox Code Playgroud)

唯一分隔符

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
Run Code Online (Sandbox Code Playgroud)