如何在文本文件中向左移动特定单元格



我有一个非常大的文本文件(制表符分隔,第一行是标题(,如下所示:

A1  A2  A3  A4  A5  A6  A7  
FA1 AB  234 231 0.02    456 I   
FA2 ACE 241 2154    0.1 324 O   
FA3 AD  AC  150 2367    0.02    123 I
FA  AFQ ASB 123 2473    0.4 630 I

正如您所看到的,在第3列第3行和第4列第3列(A3(有两个字符串。你能帮助我如何删除这些字符串,并使用awk、sed或任何Linux代码移动单元格,以获得正确的文件,如:吗

A1  A2  A3  A4  A5  A6  A7
FA1 AB  234 231 0.02    456 I
FA2 ACE 241 2154    0.1 324 O
FA3 AD  150 2367    0.02    123 I
FA  AFQ 123 2473    0.4 630 I

我试过了:

awk 'if($3!~/[0-9]+/') $3=$4}1', file

它删除第3列中的任何字符串,并将其替换为第4列,但不向左移动单元格。

使用sed

$ sed '1!s/^([^ ]* +[^ ]* +)[A-Z][^ ]* +/1/' input_file
A1  A2  A3  A4  A5  A6  A7
FA1 AB  234 231 0.02    456 I
FA2 ACE 241 2154    0.1 324 O
FA3 AD  150 2367    0.02    123 I
FA  AFQ 123 2473    0.4 630 I

1!-与第1行不匹配

^([^ ]* +[^ ]* +)-使用反向引用,我们可以存储括号的内容以存储,这将匹配到第二个空格的所有内容。

[A-Z][^ ]* +-任何不在括号内的内容都将从匹配的返回中排除。如果第三列包含大写字母字符,则不包括一直到下一个空格的所有字符。

1-返回括号中捕获的任何内容

您可以使用此awk:

awk 'BEGIN{FS=OFS="t"} NR > 1 && $3+0 != $3 {
$3 = ""; sub(FS FS, FS)} 1' file
A1   A2   A3   A4    A5    A6   A7
FA1  AB   234  231   0.02  456  I
FA2  ACE  241  2154  0.1   324  O
FA3  AD   150  2367  0.02  123  I
FA   AFQ  123  2473  0.4   630  I

这可能对你有用(GNU sed(:

sed -E '1!s/^((S+s+){2})[A-Z]S+s+/1/' file

如果第三个字段以字符AZ开头,请删除该字段及其后面的空格。

$ awk -F't+' -v OFS='t' 'NF>7{$3=""; $0=$0; $1=$1} 1' file
A1      A2      A3      A4      A5      A6      A7
FA1     AB      234     231     0.02    456     I
FA2     ACE     241     2154    0.1     324     O
FA3     AD      150     2367    0.02    123     I
FA      AFQ     123     2473    0.4     630     I

$ awk -v OFS='t' '{print $1, $2, $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF}' file
A1      A2      A3      A4      A5      A6      A7
FA1     AB      234     231     0.02    456     I
FA2     ACE     241     2154    0.1     324     O
FA3     AD      150     2367    0.02    123     I
FA      AFQ     123     2473    0.4     630     I

使用cppawk:

cppawk '
#include <cons.h>  // numberp lives here
#include <field.h> // delf here
NR > 1 && !numberp($3) { delf(3); } 1' file
A1  A2  A3  A4  A5  A6  A7  
FA1 AB  234 231 0.02    456 I   
FA2 ACE 241 2154    0.1 324 O   
FA3 AD 150 2367 0.02 123 I
FA AFQ 123 2473 0.4 630 I

最新更新