从文件中删除与另一个文件的空行相对应的行

Ahm*_*lut 6 awk paste blank-line

我有两个具有相同行数和列数的文件。用 分隔;。例子;

文件_a:

1;1;1;1;1
2;2;2;2;2
3;3;3;3;3
4;4;4;4;4
Run Code Online (Sandbox Code Playgroud)

文件_b:

A;A;A;A;A
B;B;;;B
;;;;
D;D;D;D;D
Run Code Online (Sandbox Code Playgroud)

忽略分隔符,第 3 行从file_b. 所以我想file_a在命令之前删除第 3 行;

paste -d ';' file_a file_b.

为了有这样的输出:

1;1;1;1;1;A;A;A;A;A
2;2;2;2;2;B;B;;;B
4;4;4;4;4;D;D;D;D;D
Run Code Online (Sandbox Code Playgroud)

编辑:列数为 93,每行和两个文件的列数相同,因此两个文件的行和列矩阵完全相同。

Rav*_*h13 8

您能否尝试使用 GNU 中显示的示例进行跟踪、编写和测试awk

awk '
BEGIN{
  FS=OFS=";"
}
FNR==NR{
  arr[FNR]=$0
  next
}
!/^;+$/{
  print arr[FNR],$0
}
' file_a file_b
Run Code Online (Sandbox Code Playgroud)

说明:为以上添加详细说明。

awk '                 ##Starting awk program from here.
BEGIN{                ##Starting BEGIN section from here.
  FS=OFS=";"          ##Setting field separator and output field separator as ; here.
}
FNR==NR{              ##Checking condition if FNR==NR which will be TRUE when file_a is being read.
  arr[FNR]=$0         ##Creating arr with index FNR and value is current line.
  next                ##next will skip all further statements from here.
}
!/^;+$/{              ##Checking condition if line NOT starting from ; till end then do following.
  print arr[FNR],$0   ##Printing arr with index of FNR and current line.
}
' file_a file_b       ##Mentioning Input_file names here.
Run Code Online (Sandbox Code Playgroud)


Sun*_*eep 5

由于您提到两个文件的行数相同,getline因此适合此处:

$ awk '(getline line < "f2")==1 && line ~ /[^;]/' f1
1;1;1;1;1
2;2;2;2;2
4;4;4;4;4
Run Code Online (Sandbox Code Playgroud)

您也可以在其中执行以下paste功能awk

$ awk '(getline line < "f2")==1 && line ~ /[^;]/{print $0 ";" line}' f1
1;1;1;1;1;A;A;A;A;A
2;2;2;2;2;B;B;;;B
4;4;4;4;4;D;D;D;D;D
Run Code Online (Sandbox Code Playgroud)

的返回值getline1如果行被成功读取。line ~ /[^;]检查该行是否包含任何非;字符。如果这两个条件都满足,则可以打印所需的结果。