我想跳过第一行和最后一行文件。在剩余的记录中,如果记录长度大于300,第三个字符应为k或m。有没有将这些验证结合在一起
跳过
awk 'NR>2{print v}{v=$0}' txtfile
长度
awk 'length($0) > 300'
3个字符
awk '{print substr($0,3,1))}'
无论如何,我可以把所有这些放在一起 谢谢。
答案 0 :(得分:0)
这个awk单行将在第last-1
行之前进行第二行并进行m/k
匹配:
awk 'NR>1&&/^..[mk]/&&length($0)>300{if(NR>2)print p; p=$0}' file
答案 1 :(得分:0)
首先是OP中未提供的一些示例数据:
$ cat file
first
print
nok
nom
sixsix
last
与length()<6
比较,替换为300左右:
$ awk 'b!~/^..[km]/&&length(b)<6&&NR>2{print b}{b=$0}' file
print
说明:
$ awk '
b !~ /^..[km]/ && length(b)<6 && NR>2 { print b } # analyze and print b, the buffer
{ b=$0 }' file # buffer record for next iteration
NR>2
处理第一条记录END{}
,打印缓冲区b
处理最后一条记录b !~ /^..[km]/
第三个字符是k或m length(b)<6
处理缓冲区的长度答案 2 :(得分:0)
以下将处理以防你的Input_file在你的Input_file中也有大写字母,例如 - > K
或M
,因为我将线路转换为较低的比较,所以它也应该抓住它们
awk 'prev{print prev;prev=""} FNR>1 && (substr(tolower($0),3,1)=="m" || substr(tolower($0),3,1)=="k") && length($0)>300{prev=$0} ' Input_file
代码说明:
awk '
prev {##Checking condition here if variable prev is NOT NULL then do following.
print prev; ##Printing the value of variable prev here.
prev=""} ##Making variable prev value as NULL here.
FNR>1 && (substr(tolower($0),3,1)=="m" || substr(tolower($0),3,1)=="k") && length($0)>300{##Checking conditions 1st- Making sure line number is greater than 1. 2nd- checking if 3rd character of current line is either m or k then 3rd condition if line length is greater than 300, if ALL conditions are TRUE then do following.
prev=$0} ##Setting variable prev value to current line then.
' Input_file ##Mentioning Input_file name here.