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”:不修改
awk'{for(i=7;i
$awk'{$1=$1;for(i=7;i$awk'{$1=$1;for(i=7;iawk
是你的朋友
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;iawk
是你的朋友
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没有告诉我们这一点,但我认为他的输入格式是sA1\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