使用awk-sed进行文件列操作
我有两个文件,我想合并如下。 文件1: 文件2:使用awk-sed进行文件列操作,sed,awk,Sed,Awk,我有两个文件,我想合并如下。 文件1: 文件2: AAA 9876 67 89 01 BBB 4567 23 45 23 需要最终文件 AAA 1234 9876 67 89 01 BBB 2341 4567 23 45 23 如何在awk或sed或两者中实现这一点?您可以尝试这一点(也许这是一个大的解决方案,但它可以工作): a、 awk: 您可以尝试以下方法(也许这是一个大的解决方案,但它很有效): a、 awk: transform.awk {key=($1 ~/[A-Z]+/)}
AAA
9876
67 89 01
BBB
4567
23 45 23
需要最终文件
AAA 1234 9876 67 89 01
BBB 2341 4567 23 45 23
如何在awk或sed或两者中实现这一点?您可以尝试这一点(也许这是一个大的解决方案,但它可以工作):
a、 awk:
您可以尝试以下方法(也许这是一个大的解决方案,但它很有效):
a、 awk:
transform.awk
{key=($1 ~/[A-Z]+/)}
key==1 {
if(NR>1) {printf "\n"}
printf "%s",$1}
key==0 {printf " %s",$0}
END {printf "\n"}
这将在不假定固定条目数的情况下转换文件,而是确保键符合第一行正则表达式给出的特定模式。在本例中是一段大写字母
join <(awk -F transform.awk file1) <(awk -F transform.awk file2)
jointransform.awk
{key=($1 ~/[A-Z]+/)}
key==1 {
if(NR>1) {printf "\n"}
printf "%s",$1}
key==0 {printf " %s",$0}
END {printf "\n"}
这将在不假定固定条目数的情况下转换文件,而是确保键符合第一行正则表达式给出的特定模式。在本例中是一段大写字母
join <(awk -F transform.awk file1) <(awk -F transform.awk file2)
join纯awk:
/^[A-Z]/ {
token=$1
}
/^[0-9]/{
for (i=1; i<=NF; i++) {
C[token]=C[token] " " $i
}
}
END {
for (i in C) {
print i, C[i]
}
}
可缩短为三衬板:
/^[A-Z]/ { token=$1 }
/^[0-9]/ { C[token]=C[token] " " $0 }
END { for (i in C) { print i, C[i] } }
纯awk:
/^[A-Z]/ {
token=$1
}
/^[0-9]/{
for (i=1; i<=NF; i++) {
C[token]=C[token] " " $i
}
}
END {
for (i in C) {
print i, C[i]
}
}
可缩短为三衬板:
/^[A-Z]/ { token=$1 }
/^[0-9]/ { C[token]=C[token] " " $0 }
END { for (i in C) { print i, C[i] } }
+1-可缩短为一个衬里。在
中使用访问的数组元素顺序不保证。您可以将索引保存在数字索引数组中,并使用双下标访问它们以保持顺序。或者,您可以在每次看到新标记时进行打印。+1-可以缩短为一行。在
中使用访问的数组元素顺序不保证。您可以将索引保存在数字索引数组中,并使用双下标访问它们以保持顺序。或者,您可以在每次看到新令牌时进行打印。