Awk 将列批量转换为具有文件名的行
我有1000多个文件(标签有限),我需要像这样将所有数据转换成一个文件 示例文件02Awk 将列批量转换为具有文件名的行,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
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
}