Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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:使用cut提取列并进一步过滤一列_Bash_Awk_Grep_Cut - Fatal编程技术网

Bash:使用cut提取列并进一步过滤一列

Bash:使用cut提取列并进一步过滤一列,bash,awk,grep,cut,Bash,Awk,Grep,Cut,我有一个制表符分隔的文件,并希望提取一些列与削减 两个示例行 (...) 0 0 1 0 AB=1,2,3;CD=4,5,6;EF=7,8,9 0 0 1 1 0 0 AB=2,1,3;CD=1,1,2;EF=5,3,4 0 1 (...) 我想要实现的是选择第2、3、5和7列,但是从第5列只选择CD=4、5、6 所以我的预期结果是 0 1 CD=4,5,6; 0 1 0 CD=1,1,2;

我有一个制表符分隔的文件,并希望提取一些列与削减

两个示例行

(...)
0    0    1    0    AB=1,2,3;CD=4,5,6;EF=7,8,9    0    0
1    1    0    0    AB=2,1,3;CD=1,1,2;EF=5,3,4    0    1
(...)
我想要实现的是选择第2、3、5和7列,但是从第5列只选择CD=4、5、6

所以我的预期结果是

0    1    CD=4,5,6;    0
1    0    CD=1,1,2;    1
如何使用cut解决此问题并在提取的列之一上运行grep?当然,任何其他一个衬里也可以。用awk做起来更容易。使用拆分第5个字段;作为分隔符,然后打印第二个子字段

awk 'BEGIN {FS="\t"; OFS="\t"} 
     {split($5, a, ";"); print $2, $3, a[2]";", $7 }' inputfile > outputfile
如果要打印以CD=开头的子字段,请使用循环:

awk 'BEGIN {FS="\t"; OFS="\t"} 
     {n = split($5, a, ";");
      for (i = 1; i <= n; i++) {
        if (a[i] ~ /^CD=/) subfield = a[i];
      }
      print $2, $3, subfield";", $7}' < inputfile > outputfile
用awk做起来更容易。使用拆分第5个字段;作为分隔符,然后打印第二个子字段

awk 'BEGIN {FS="\t"; OFS="\t"} 
     {split($5, a, ";"); print $2, $3, a[2]";", $7 }' inputfile > outputfile
如果要打印以CD=开头的子字段,请使用循环:

awk 'BEGIN {FS="\t"; OFS="\t"} 
     {n = split($5, a, ";");
      for (i = 1; i <= n; i++) {
        if (a[i] ~ /^CD=/) subfield = a[i];
      }
      print $2, $3, subfield";", $7}' < inputfile > outputfile
这是另一个awk

还是用剪切/粘贴

$ paste <(cut -f2,3 file) <(cut -d';' -f2 file) <(cut -f7 file)

0       1       CD=4,5,6        0
1       0       CD=1,1,2        1
这是另一个awk

还是用剪切/粘贴

$ paste <(cut -f2,3 file) <(cut -d';' -f2 file) <(cut -f7 file)

0       1       CD=4,5,6        0
1       0       CD=1,1,2        1
我认为awk是完成这类任务的最佳工具,另外两个答案为您提供了很好的简短解决方案

我想指出的是,在解析输入时,可以使用awk的内置拆分功能来获得更大的灵活性。下面是一个使用隐式拆分的示例脚本:

解析.awk

还记得第二、第三和第七列吗 { a=$2 b=3美元 d=7美元 } 在上拆分第五列;。之后是位置变量 e、 g.$1、$2、$NF包含上一个 第五纵队 { oldFS=FS FS=; $0 = $5 } 例如,要测试第二个元素是否以CD开头,请执行以下操作 像这样的 $2~/^CD/{ c=2美元 } 打印所选元素 { 打印a、b、c、d } 恢复FS { FS=oldFS } 按如下方式运行:

awk -f parse.awk FS='\t' OFS='\t' infile
输出:

01 CD=4,5,6 0 10 CD=1,1,21 我认为awk是完成这类任务的最佳工具,另外两个答案为您提供了很好的简短解决方案

我想指出的是,在解析输入时,可以使用awk的内置拆分功能来获得更大的灵活性。下面是一个使用隐式拆分的示例脚本:

解析.awk

还记得第二、第三和第七列吗 { a=$2 b=3美元 d=7美元 } 在上拆分第五列;。之后是位置变量 e、 g.$1、$2、$NF包含上一个 第五纵队 { oldFS=FS FS=; $0 = $5 } 例如,要测试第二个元素是否以CD开头,请执行以下操作 像这样的 $2~/^CD/{ c=2美元 } 打印所选元素 { 打印a、b、c、d } 恢复FS { FS=oldFS } 按如下方式运行:

awk -f parse.awk FS='\t' OFS='\t' infile
输出:

01 CD=4,5,6 0 10 CD=1,1,21
必须用割伤吗?awk会更好,因为你可以使用该列上的拆分函数来提取其中的一部分。他说任何其他一行也可以,所以你可以继续给他你的awk答案。awk也很好,我只是认为剪切是第一个。必须用剪切来完成吗?awk会更好,因为你可以使用该列上的拆分函数提取其中的一部分。他说任何其他一行也可以,所以你可以继续给他你的awk答案awk也很好,我只是认为剪切是第一个。如果第五个字段中的条目数量不总是相同的,并且不总是包含CD=…,我会做什么更改?因此,您希望打印第五个字段中以CD=开头的条目,而不总是第二个条目?这在问题中并不明显,因为结果与您的示例输入文件都是一样的。没错,谢谢您指出这一点,这在开始时我并不清楚。如果第5个字段中的条目数量不总是相同的,并且不总是包含CD=…?那么您想打印第5个字段中以CD=,而不总是第2个条目开头的条目吗?这在问题中并不明显,因为结果与示例输入文件的结果都是一样的。没错,感谢您指出这一点,我一开始并不清楚。我最喜欢的解决方案是剪切和粘贴。我最喜欢的解决方案是剪切和粘贴。