我有一个非常大的文本文件(制表符分隔,第一行是标题(,如下所示:
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
如果第三个字段以字符A
到Z
开头,请删除该字段及其后面的空格。
$ 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