使用awk-sed进行文件列操作

使用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]+/)}

我有两个文件,我想合并如下。 文件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]+/)}

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-可以缩短为一行。在
中使用
访问的数组元素顺序不保证。您可以将索引保存在数字索引数组中,并使用双下标访问它们以保持顺序。或者,您可以在每次看到新令牌时进行打印。