Awk 将列批量转换为具有文件名的行

Awk 将列批量转换为具有文件名的行,awk,Awk,我有1000多个文件(标签有限),我需要像这样将所有数据转换成一个文件 示例文件02 Apple01 cpu01 Computer Desktop mouse Dell1.2 cpu06 keybord printer usb-0.2 cable Asus0.3 cpu07 Mouse drive Dvd 预期产量 File02 Apple01,Dell1.2,Asus0.3 cpu01,cpu06,cpu07 Computer Desktop mouse,keybord p

我有1000多个文件(标签有限),我需要像这样将所有数据转换成一个文件

示例文件02

Apple01  cpu01  Computer Desktop mouse
Dell1.2  cpu06  keybord printer usb-0.2 cable
Asus0.3  cpu07  Mouse drive Dvd 
预期产量

File02  Apple01,Dell1.2,Asus0.3  cpu01,cpu06,cpu07 Computer Desktop mouse,keybord printer usb-0.2 cable,Mouse drive Dvd 
我厌倦了awk

awk -v RS= -v OFS="," -F'\n' '/----/{next}$1=$1' 

但它只不过是换位而已,你可以试试这个
awk

awk '
BEGIN {
    FS=OFS="\t"
}
NR==1 {
   for (i=1; i<=NF; i++)
      c[i]=$i
   next
}
{
   for (i=1; i<=NF; i++)
      c[i]=c[i] "," $i
}
END {
   printf "%s", FILENAME OFS
   for (i=1; i<=NF; i++)
      printf "%s", c[i] (i<NF?OFS:ORS)
}
' File02
awk'
开始{
FS=OFS=“\t”
}
NR==1{

对于(i=1;i这可能就是您正在寻找的,使用GNU awk作为ENDFILE,并使用您问题中输入文件的两个副本进行测试:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
    for (i=1; i<=NF; i++) {
        a[i] = (i in a ? a[i] "," : "") $i
    }
}
ENDFILE {
    printf "%s", FILENAME
    for (i=1; i<=NF; i++) {
        printf "%s%s", OFS, a[i]
    }
    print ""
    delete a
}
对于其他AWK,您可以执行以下操作:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
FNR==1 { prt() }
{
    for (i=1; i<=NF; i++) {
        a[i] = (i in a ? a[i] "," : "") $i
    }
    fname = FILENAME
}
END { prt() }

function prt(   i) {
    printf "%s", fname
    for (i=1; i<=NF; i++) {
        printf "%s%s", OFS, a[i]
    }
    print ""
    delete a
}
$cat tst.awk
开始{FS=OFS=“\t”}
FNR==1{prt()}
{

对于(i=1;iIt有效,但如何处理多个文件您编写了此问题
将所有数据转换为一个文件
,从未要求在多个文件上运行此操作。否则,在多个文件上运行此操作的更改很小。如果您需要处理多个文件,则应至少提供2个文件作为示例(3会更好,但2是最小的)a)充分证明问题,b)给我们一些我们可以测试的东西,看看潜在的解决方案是否有效(适用于一个文件的东西可能不适用于多个文件).Btw您发布的awk脚本与您试图解决的问题完全无关。如果您告诉我们您在那里的想法,我们可以解释您在哪里出轨了。此外,如果您的输入文件包含需要以不同于其他行的方式处理的
-
行,那么您的输入文件中就没有其他行了你的问题表明,所以你得到的答案将无法做到这一点。
$ cat tst.awk
BEGIN { FS=OFS="\t" }
FNR==1 { prt() }
{
    for (i=1; i<=NF; i++) {
        a[i] = (i in a ? a[i] "," : "") $i
    }
    fname = FILENAME
}
END { prt() }

function prt(   i) {
    printf "%s", fname
    for (i=1; i<=NF; i++) {
        printf "%s%s", OFS, a[i]
    }
    print ""
    delete a
}