我有一句话:
one:two:three:four:five:six seven:eight
Run Code Online (Sandbox Code Playgroud)
我想用awk获得 $1是一个$2是two: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上测试的,但是我看不出为什么这不适用于其他版本的任何原因.
有些像这样?
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)