在Unix中粘贴具有不等行和多列的文件
假设我有三个文件,内容如下: 文件1:在Unix中粘贴具有不等行和多列的文件,unix,awk,paste,Unix,Awk,Paste,假设我有三个文件,内容如下: 文件1: AAA BBB CCC 123 563 2467 文件2: NA NA NA 文件3: DDD EEE FFF 2333 236 908 123 376 887 我要粘贴这些文件并为空字段插入0,如下所示: AAA BBB CCC NA NA NA DDD EEE FFF 123
AAA BBB CCC
123 563 2467
文件2:
NA NA NA
文件3:
DDD EEE FFF
2333 236 908
123 376 887
我要粘贴这些文件并为空字段插入0,如下所示:
AAA BBB CCC NA NA NA DDD EEE FFF
123 563 2467 0 0 0 2333 236 908
0 0 0 0 0 0 123 376 887
我甚至无法通过粘贴的第一步。当我尝试粘贴文件1文件2文件3时,它变得像:
AAA BBB CCC NA NA NA DDD EEE FFF
123 563 2467 2333 236 908
123 376 887
虽然我发现pr-m-tfile1file2file3可以工作,但它不显示完整字符串,因为我有一些长字符串
在这种情况下,我如何让它工作?提前感谢。您可以使用GNU awk(修改自。请注意订购部分):
您可以使用GNU awk(修改自。请注意订购部分):
你能试试下面的吗。这看起来更健壮,下面是这一个的优点
- 如果没有GNU
awk
,它也应该可以工作(尽管我不能在所有版本上进行测试)
- 它将查找所有传递的输入_文件中的最大行数,并根据该空行中的最大字段数打印零
- 它还将查看是否有一行(第一个输入_文件中的第二行和第二个输入_文件中的第二行),如果它们的字段数较少,它也将向该行添加剩余的数字字段(简单地追加)
awk'
FNR==1{
总计字段=总计字段>NF?总计字段:NF
++文件
}
{
文件行[文件]++
a[FNR,文件]=$0
}
结束{
用于(文件行中的i){
val=val>文件行[i]?val:文件行[i]
}
对于(i=1;i你能试试下面的吗?这个看起来更坚固,下面是这个的优点
- 如果没有GNU
awk
,它也应该可以工作(尽管我不能在所有版本上进行测试)
- 它将查找所有传递的输入_文件中的最大行数,并根据该空行中的最大字段数打印零
- 它还将查看是否有一行(第一个输入_文件中的第二行和第二个输入_文件中的第二行),如果它们的字段数较少,它也将向该行添加剩余的数字字段(简单地追加)
awk'
FNR==1{
总计字段=总计字段>NF?总计字段:NF
++文件
}
{
文件行[文件]++
a[FNR,文件]=$0
}
结束{
用于(文件行中的i){
val=val>文件行[i]?val:文件行[i]
}
对于(i=1;i,这里是另一种方法
$ paste -d~ file1 file2 file3 |
awk -F~ '{$1=$1; for(i=1;i<=NF;i++) if($i=="") $i=nvl[i]}1
NR==1 {for(i=1;i<=NF;i++) {gsub(/[^ ]+/,0,$i); nvl[i]=$i}}' | column -t
AAA BBB CCC NA NA NA DDD EEE FFF
123 563 2467 0 0 0 2333 236 908
0 0 0 0 0 0 123 376 887
这是另一种方法
$ paste -d~ file1 file2 file3 |
awk -F~ '{$1=$1; for(i=1;i<=NF;i++) if($i=="") $i=nvl[i]}1
NR==1 {for(i=1;i<=NF;i++) {gsub(/[^ ]+/,0,$i); nvl[i]=$i}}' | column -t
AAA BBB CCC NA NA NA DDD EEE FFF
123 563 2467 0 0 0 2333 236 908
0 0 0 0 0 0 123 376 887
由于我正在用空格inits值替换新插入的0
,因此可能会影响OP的数据(如果存在任何0),所以正在进行修复。好的,我现在已经修复了这个零问题,用其他几个示例进行了测试,现在看起来不错,干杯。因为我正在用空格inits值替换新插入的0
,它可能会影响OP的数据(如果有任何0),所以正在进行修复。好的,我现在已经修复了这个零问题,使用了一些其他示例进行了测试,现在看起来很好,干杯。请检查解决方案并让我们知道这些是否对您有帮助?请检查解决方案并让我们知道这些是否对您有帮助?
awk '
FNR==1{
total_fields=total_fields>NF?total_fields:NF
++file
}
{
file_lines[file]++
a[FNR,file]=$0
}
END{
for(i in file_lines){
val=val>file_lines[i]?val:file_lines[i]
}
for(i=1;i<=val;i++){
for(j=1;j<=file;j++){
num=split(a[i,j],array," ")
if(num<total_fields){
new_val=sprintf("%0"total_fields-num"d","")
##printf "....... "total_fields-num">>>>"new_val" "
gsub(/0/,"0 ",new_val)
a[i,j]=(a[i,j]?a[i,j] OFS:"")new_val
new_val=""
}
if(!a[i,j]){
a[i,j]=sprintf("%0"total_fields"d",a[i,j])
gsub(/0/,"0 ",a[i,j])
}
printf("%s%s",a[i,j],j==file?ORS:OFS)
new_val=""
}
}
}
' file1 file2 file3 | column -t
$ paste -d~ file1 file2 file3 |
awk -F~ '{$1=$1; for(i=1;i<=NF;i++) if($i=="") $i=nvl[i]}1
NR==1 {for(i=1;i<=NF;i++) {gsub(/[^ ]+/,0,$i); nvl[i]=$i}}' | column -t
AAA BBB CCC NA NA NA DDD EEE FFF
123 563 2467 0 0 0 2333 236 908
0 0 0 0 0 0 123 376 887
$ pr -Jmt file{1..3}