Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BASH-使用for循环和If语句更改列2中的信息_Bash_Loops_If Statement_Awk_Multiple Columns - Fatal编程技术网

BASH-使用for循环和If语句更改列2中的信息

BASH-使用for循环和If语句更改列2中的信息,bash,loops,if-statement,awk,multiple-columns,Bash,Loops,If Statement,Awk,Multiple Columns,我有以下选项卡分隔文件: A1 A1 0 0 1 1 0 0 0 0 2 2 1 2 A2 A2 0 0 1 1 1 1 1 1 0 0 1 2 A3 A3 0 0 1 2 1 1 1 1 0 0 2 2 A4 A4 0 0

我有以下选项卡分隔文件:

A1    A1    0       0       1       1       0 0     0 0     2 2     1 2
A2    A2    0       0       1       1       1 1     1 1     0 0     1 2
A3    A3    0       0       1       2       1 1     1 1     0 0     2 2
A4    A4    0       0       1       1       1 1     0 0     0 0     1 2
这样做的目的是修改第7列(包括)和末尾之间的信息,对于每一行,如果第7列和第8列:

  • 等于“0”:不修改

  • 等于“1”:不修改

  • 等于“12”或“21”:更改为“22”

  • 等于“2”:不修改

以下列也是一样(9和10,然后是11和12,13和14,依此类推)

我开始使用以下命令提取要处理的列:


awk'{for(i=7;i
$awk'{$1=$1;for(i=7;i
$awk'{$1=$1;for(i=7;i
awk
是你的朋友

awk -v FS='\t' -v OFS='\t' '{for(i=7;i<=NF;i++) \
 {if($i ~ /^[ 2]*[1]{1}[ 2]*$/){$i="2 2"}}}1'  file

awk-vfs='\t'-vofs='\t'{for(i=7;i
awk
是你的朋友

awk -v FS='\t' -v OFS='\t' '{for(i=7;i<=NF;i++) \
 {if($i ~ /^[ 2]*[1]{1}[ 2]*$/){$i="2 2"}}}1'  file

awk-vfs='\t'-vofs='\t'{for(i=7;i从您的问题来看,以下几对列是空格分隔的(第7和第8列),(第9和第10列),(第11和第12列),(第13和第14列)。其他列是制表符分隔的。如果是这种情况,您可以不使用循环来完成

awk '{sub("1 2","2 2",$0);sub("2 1","2 2",$0); print;}' <filename>
awk'{sub(“12”、“22”和$0);sub(“21”、“22”和$0);print;}'

从您的问题来看,以下几对列是以空格分隔的(第7和第8列)、第9和第10列、第11和第12列、第13和第14列)。其他列是以制表符分隔的。如果是这种情况,您可以不使用循环

awk '{sub("1 2","2 2",$0);sub("2 1","2 2",$0); print;}' <filename>
awk'{sub(“12”、“22”和$0);sub(“21”、“22”和$0);print;}'

听起来您需要的只是:

$ awk '{gsub(/1 2|2 1/,"2 2")}1' file
A1      A1      0       0       1       1       0 0     0 0     2 2     2 2
A2      A2      0       0       1       1       1 1     1 1     0 0     2 2
A3      A3      0       0       1       2       1 1     1 1     0 0     2 2
A4      A4      0       0       1       1       1 1     0 0     0 0     2 2

但是,您的示例输入/输出实际上无助于演示文本描述的内容,而且我认为您的字段并不像您所说的那样完全分开,所以这只是一个猜测。

听起来您需要的只是:

$ awk '{gsub(/1 2|2 1/,"2 2")}1' file
A1      A1      0       0       1       1       0 0     0 0     2 2     2 2
A2      A2      0       0       1       1       1 1     1 1     0 0     2 2
A3      A3      0       0       1       2       1 1     1 1     0 0     2 2
A4      A4      0       0       1       1       1 1     0 0     0 0     2 2

但是您的示例输入/输出实际上无助于演示文本描述的内容,我不认为您的字段真的像您所说的那样都是以制表符分隔的,所以这只是一个猜测。

Hmm您的输入和输出之间的唯一区别似乎是每一行都已更改为以
2
结尾。您能回答这个问题吗更清楚地解释要修改的条件和列?在提供示例输入和预期输出时,您应该涵盖所有用例,以演示您试图在文本中解释的内容。现在,您的示例输出使您的问题看起来可以通过将ev的最后2个字段更改为
2
来解决你已经问了一行,你得到的答案是响亮的,正确的,不是bash,那么为什么你现在又回来问bash解决方案呢?我猜你的输入文件不是全部用tab分隔的,比如,你的第一行实际上是
A1\tA1\t0\t0\t1\t0\t0\t2 2\t1 2
,用空白字符代替tab在以制表符分隔的文件的字段7开始的成对数字之间,因此字段7实际上是
0
?嗯,输入和输出之间的唯一区别似乎是每一行都已更改为以
2
结尾。您能更清楚地解释条件和要修改的列吗?何时提供示例输入和预期输出,您应该涵盖所有用例,以演示您试图在文本中解释的内容。现在,您的示例输出使您的问题看起来可以通过将每行的最后2个字段更改为
2
来解决。您已经问了a,得到的答案是响亮的y、 正确地说,不是bash,那么你为什么现在又回来要求bash解决方案呢?我猜你的输入文件不是全部用制表符分隔的,例如,你的第一行实际上是
A1\tA1\t0\t0\t1\t1\t0\t0\t2 2\t12
,带有空白字符,而不是从制表符分隔符字段7开始的数字对之间的制表符编辑文件,因此字段7实际上是
0 0
?这将用空白字符替换文件中的所有制表符。OP没有告诉我们这一点,但我认为他的输入格式是
A1\tA1\t0\t0\t1\t1\t0\t0\t22\t12
,将用空白字符替换文件中的所有制表符。OP没有告诉我们这一点,但我认为他的输入格式是s
A1\tA1\t0\t0\t1\t1\T00\T00\t2 2\t1 2
$ awk '{gsub(/1 2|2 1/,"2 2")}1' file
A1      A1      0       0       1       1       0 0     0 0     2 2     2 2
A2      A2      0       0       1       1       1 1     1 1     0 0     2 2
A3      A3      0       0       1       2       1 1     1 1     0 0     2 2
A4      A4      0       0       1       1       1 1     0 0     0 0     2 2