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个条目开头的条目吗?这在问题中并不明显,因为结果与示例输入文件的结果都是一样的。没错,感谢您指出这一点,我一开始并不清楚。我最喜欢的解决方案是剪切和粘贴。我最喜欢的解决方案是剪切和粘贴。