Awk 如何通过计算列(字符数)来获取字段

Awk 如何通过计算列(字符数)来获取字段,awk,Awk,我有一个logfile.txt,我想指定字段$4,但基于列数而不是字段数,因为字段由空格字符分隔,字段2($2)可能包含由空格分隔的值。我想计算行数,但如果字段2($2)包含空格字符,我不知道如何指定$4,而不引起问题 这是我的档案: KJKJJ1KLJKJKJ928482711 PIEJHHKIA 87166188177633 AJHHHH77760 00666667 876876800874

我有一个
logfile.txt
,我想指定字段$4,但基于列数而不是字段数,因为字段由空格字符分隔,字段2(
$2
)可能包含由空格分隔的值。我想计算行数,但如果字段2(
$2
)包含空格字符,我不知道如何指定
$4
,而不引起问题

这是我的档案:

KJKJJ1KLJKJKJ928482711           PIEJHHKIA      87166188177633         AJHHHH77760                00666667        876876800874          2014100898798789979879877770
KJKJJ1KLJKJKJ928482711                HKHG      81882776553868        HGHALJLKA700                00876763        216897879879          2014100898798789979879877770
KJKJJ1KLJKJKJ928482711            UUT UGGT      81762665356426   HGJHGHJG661557008                00778787        268767860704          2014100898798789979879877770
KJKJJ1KLJKJKJ9284827kj            ARTH HGG      08276255534867   HGJHGHJG661557008                00876767        212668767684          2014100898798789979879877770
代码如下:

awk 'END {  OFS="\t"; for (k in c)      print  c[k],"\t"k,"\t"f[k] }  {   k = $4  c[k]++; f[k]=substr($0,137,8)   }'    logfile.txt

我想根据字段$4计算。但要在代码中指定此字段,我们必须基于字符数(substr($0,…):

输出应为:

1   20141008        AJHHHH77760
1   20141008        HGHALJLKA700
2   20141008        HGJHGHJG661557008

如果记录由固定宽度字段组成,则可以使用
cut(1)

请为每个固定宽度字段写一个范围,以代替省略号
。 我只写了前三个,懒惰的我


如果您不想麻烦处理中间文件,只需使用
|
管道。

为什么所有内容都在
END
块中?预期的输出是什么?您所做的想法是什么?这将帮助人们理解并找到解决方案。我想根据字段$4进行计算。但要在代码中指定此字段,我们必须基于关于字符数:输出应该是:1 20141008 AJHHHHH77760 1 20141008 HGHALJLKA700 1 20141008 JHJHJHJJJJJJUA876 1 20141008 HGJHJHJJJG661557008你在网站上问了很多问题来了解基本知识:在问题中添加完整的解释,而不是在评论中,也不是在答案中。试着让人们更容易阅读你的任务它将帮助我们,更重要的是,它将帮助您获得答案。Unix命令行是围绕使用将转换应用于文本文件的小工具这一理念构建的,只需要知道正确的工具……另外,请查看,例如,对于不同的、类似的任务,在
paste(1)
split(1)
join(1)
% cut -c1-22,23-42,43-62,... --output-delimiter=, file | sed 's/, */,/g' > file.csv
% awk -F, '{your_code}' file.csv