我有一个如下所示的文件:
A a
2 b
3 c
4 d
5 e
B a
2 b
3 c
4 d
5 e
输出应该是这样的
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e
这个脚本:
awk {if ( NR%5 != 1 ) {print VAR, $2} else {print $1, $2} VAR=$1}
不起作用(结果如下):
A a
A b
2 c
3 d
4 e
B a
B b
2 c
3 d
4 e
看来我遗漏了一些关于语法或变量工作方式的内容。 awk 脚本有解决方案吗?
谢谢
答案1
$ 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
如果在字段开头检测到大写字符,则只需将变量设置为第一个字段的值。然后,它无条件地将第一个字段设置为保存的数据并打印该行。
使用每五行选取第一个字段的方法,并进行简化:
$ 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
for每一个输入线:
{
if ( NR%5 != 1 ) {
print VAR, $2
} else {
print $1, $2
}
VAR = $1 # <-- problem: is triggered on every line
}
答案2
通过下面的脚本完成
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
输出
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e