我有一句话:
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
进行一些操作,所以我不想只替换:
的第一次出现。
答案 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