用于最终记录的特殊AWK命令
我使用下面的脚本来计算排序集中的唯一字符串用于最终记录的特殊AWK命令,awk,Awk,我使用下面的脚本来计算排序集中的唯一字符串 awk '{if (p==$1) print 0,p;else print 1,p} {p=$1}' 1.txt > 2.txt Input a a a b c c d d d output 0 a 0 a 1 a 1 b 0 c 1 c 0 d 0 d 0 d 我使用1来指定一个唯一集合何时结束,一个新集合何时开始,但是awk不会将1添加到最后一个集合中,因为没有下一行可与之比较。当没有下一行时,我有没有办法指定一种特殊的行为 目前,我正
awk '{if (p==$1) print 0,p;else print 1,p} {p=$1}' 1.txt > 2.txt
Input
a
a
a
b
c
c
d
d
d
output
0 a
0 a
1 a
1 b
0 c
1 c
0 d
0 d
0 d
我使用1来指定一个唯一集合何时结束,一个新集合何时开始,但是awk不会将1添加到最后一个集合中,因为没有下一行可与之比较。当没有下一行时,我有没有办法指定一种特殊的行为
目前,我正在添加以下shell脚本来处理这个问题,但我想在awk脚本中找到一种方法
lines=`wc -l sort.txt| cut -d " " -f 1`
awk -v a=$lines '{if (p==$1) print 0,p;if (p!=$1||NR==a) print 1,p} {p=$1}' sort.txt > index.txt
当awk处理完所有输入(或被告知退出)时,您可以使用
END{…}
块来执行操作。当awk处理完所有输入(或被告知退出)时,您可以使用END{…}
块来执行操作。您可以使用END{…}
块在awk处理完所有输入(或被告知退出)后执行操作。当awk处理完所有输入(或被告知退出)后,您可以使用结束{…}
块执行操作。您可能想更改打印内容:
awk '{if (p==$1) print 0,$1;else print 1,$1} {p=$1}' 1.txt
您可能希望更改打印内容:
awk '{if (p==$1) print 0,$1;else print 1,$1} {p=$1}' 1.txt
您可能希望更改打印内容:
awk '{if (p==$1) print 0,$1;else print 1,$1} {p=$1}' 1.txt
您可能希望更改打印内容:
awk '{if (p==$1) print 0,$1;else print 1,$1} {p=$1}' 1.txt
我能够让这个脚本工作
awk 'BEGIN{p=$1}{if ($1==p) print 0,p;if (p!=$1&&p!="") print 1,p} {p=$1}END{print 1,p}' 1.txt
input
a
a
a
b
c
c
d
d
d
output
0 a
0 a
1 a
1 b
0 c
1 c
0 d
0 d
1 d
我能够让这个脚本工作
awk 'BEGIN{p=$1}{if ($1==p) print 0,p;if (p!=$1&&p!="") print 1,p} {p=$1}END{print 1,p}' 1.txt
input
a
a
a
b
c
c
d
d
d
output
0 a
0 a
1 a
1 b
0 c
1 c
0 d
0 d
1 d
我能够让这个脚本工作
awk 'BEGIN{p=$1}{if ($1==p) print 0,p;if (p!=$1&&p!="") print 1,p} {p=$1}END{print 1,p}' 1.txt
input
a
a
a
b
c
c
d
d
d
output
0 a
0 a
1 a
1 b
0 c
1 c
0 d
0 d
1 d
我能够让这个脚本工作
awk 'BEGIN{p=$1}{if ($1==p) print 0,p;if (p!=$1&&p!="") print 1,p} {p=$1}END{print 1,p}' 1.txt
input
a
a
a
b
c
c
d
d
d
output
0 a
0 a
1 a
1 b
0 c
1 c
0 d
0 d
1 d
这将在最后一个字母处打印
1
awk 'NR>1 {print p==$1?0 FS p:1 FS p} {p=$1} END {print 1,$0}' file
0 a
0 a
1 a
1 b
0 c
1 c
0 d
0 d
1 d
这将在最后一个字母处打印
1
awk 'NR>1 {print p==$1?0 FS p:1 FS p} {p=$1} END {print 1,$0}' file
0 a
0 a
1 a
1 b
0 c
1 c
0 d
0 d
1 d
这将在最后一个字母处打印
1
awk 'NR>1 {print p==$1?0 FS p:1 FS p} {p=$1} END {print 1,$0}' file
0 a
0 a
1 a
1 b
0 c
1 c
0 d
0 d
1 d
这将在最后一个字母处打印
1
awk 'NR>1 {print p==$1?0 FS p:1 FS p} {p=$1} END {print 1,$0}' file
0 a
0 a
1 a
1 b
0 c
1 c
0 d
0 d
1 d
不太清楚您想要什么,因为您的输入文件没有返回输出部分指示的内容。你能核对一下吗?据我所知,他的输入和输出是一致的。他正在为每行预加一个0或1。@fedorqui感谢您的关注。我没有打印我的第一行,因为同样的问题阻止我打印最后一行。不太清楚您想要什么,因为您的输入文件没有返回输出部分指示的内容。你能核对一下吗?据我所知,他的输入和输出是一致的。他正在为每行预加一个0或1。@fedorqui感谢您的关注。我没有打印我的第一行,因为同样的问题阻止我打印最后一行。不太清楚您想要什么,因为您的输入文件没有返回输出部分指示的内容。你能核对一下吗?据我所知,他的输入和输出是一致的。他正在为每行预加一个0或1。@fedorqui感谢您的关注。我没有打印我的第一行,因为同样的问题阻止我打印最后一行。不太清楚您想要什么,因为您的输入文件没有返回输出部分指示的内容。你能核对一下吗?据我所知,他的输入和输出是一致的。他正在为每行预加一个0或1。@fedorqui感谢您的关注。我没有打印我的第一行,因为同样的问题使我无法打印最后一行。我尝试过这一方法,但每次都只会复制最终记录(1的值现在为1美元)。有什么办法吗?我看你已经明白了。是的,你只需要手动“关闭”你在
END
块中最后看到的字段。我已经尝试过了,但每次都是重复最后的记录(现在1的值是$1)。有什么办法吗?我看你已经明白了。是的,你只需要手动“关闭”你在END
块中最后看到的字段。我已经尝试过了,但每次都是重复最后的记录(现在1的值是$1)。有什么办法吗?我看你已经明白了。是的,你只需要手动“关闭”你在END
块中最后看到的字段。我已经尝试过了,但每次都是重复最后的记录(现在1的值是$1)。有什么办法吗?我看你已经明白了。是的,你只需要手动“关闭”你在END
块中最后一次看到的字段。如果我们在打高尔夫:awk'{$2=$1;$1=p!=$2;p=$2}1'
你能想出一种方法让1位于集合的末尾而不是开始吗?只要把$2设置为0/1值:awk'{$2=p!=$1;p=$1}1'
或者更容易理解的是awk'{(p==$1){$2=0}其他{$2=1};p=$1;print}'
--或者如果有其他字段,而不是$2
使用$(NF+1)
如果我们在打高尔夫:awk'{$2=$1;$1=p!=$2;p=$2}1'
你能想出一种方法让1位于集合的末尾而不是开始吗?只要将$2设置为0/1的值即可{$2=p!=$1;p=$1}1'或更易懂的awk'{if(p==1){$2=0}其他{$2=1};p=$1;print}'
——或者如果有其他字段,而不是$2
使用$(NF+1)
如果我们在打高尔夫:awk'{$2=$1;$1=p!=$2;p=$2}1'
你能想出一种方法让1位于集合的末尾而不是开头吗?只需将$2设置为0/1值:awk'{$2=p!=$1;p=$1}1'
或者更容易理解的awk'{if(p==1){$2=0}else{$2=1};p=$1;print}'
--或者如果有其他字段,而不是$2
使用$NF 1)
如果我们在打高尔夫:awk'{$2=$1;$1=p!=$2;p=$2}1'
你能想出一种方法让1在集合的末尾而不是开始吗?只要把$2设置为0/1值:awk'{$2=p!=$1;p=$1}1'
或者更容易理解的方法是awk'{If(p=$1){$2=0}else$2=1;p}$1}“
--或者如果有其他字段,则使用$(NF+1)