首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >N记录字段的增量(复制)

N记录字段的增量(复制)
EN

Unix & Linux用户
提问于 2020-03-16 12:35:09
回答 2查看 67关注 0票数 2

我有一个像这样的文件:

代码语言:javascript
复制
A a
2 b
3 c
4 d
5 e
B a
2 b
3 c
4 d
5 e

输出应该类似于

代码语言:javascript
复制
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

这个脚本:

代码语言:javascript
复制
awk {if ( NR%5 != 1 ) {print VAR, $2} else {print $1, $2} VAR=$1}

不起作用(结果如下):

代码语言:javascript
复制
A a
A b
2 c
3 d
4 e
B a
B b
2 c
3 d
4 e

我似乎遗漏了一些关于语法或变量工作方式的东西。在awk脚本中有解决方案吗?

谢谢

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-03-16 13:39:58

代码语言:javascript
复制
$ awk '$1 ~ /^[[:upper:]]/ { letter = $1 } { $1 = letter; print }' file
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

这只是将变量letter设置为第一个字段的值,如果它在字段的开头检测到大写字符。然后无条件地将第一个字段设置为保存的数据并打印行。

使用您的方法每五行提取第一个字段,简化如下:

代码语言:javascript
复制
$ awk 'FNR % 5 == 1 { letter = $1 } { $1 = letter; print }' file
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

在这两个变体中,我无条件地将第一个字段设置为letter值并打印当前记录。这简化了代码。

代码中的主要错误是,它将每个输入行的VAR设置为$1

代码语言:javascript
复制
{
    if ( NR%5 != 1 ) {
        print VAR, $2
    } else {
        print $1, $2
    }
    VAR = $1  # <-- problem: is triggered on every line
}
票数 3
EN

Unix & Linux用户

发布于 2020-03-19 04:49:00

按以下脚本完成

代码语言:javascript
复制
step1: z=`awk 'END{print NR}' filename`
 step2: for ((i=1;i<=$z;i++)); do j=$(($i+4)); u=`awk -v i="$i" 'NR==i{print $1}' o.txt`;sed -n ''$i','$j'p' filename| awk -v u="$u" '{$1=u;print $0}'; i=$j; done

输出

代码语言:javascript
复制
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/573198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档