我知道这是一个简单的问题,并且之前已经在很多方面得到了回答,但是我所看到的 awk、sed、grep 等的每次使用都在选择和打印您想要的列。如果您想要的列数未知,而您不想要的特定列,您如何删除您不想要的列?
您是否只需选择前面的列,然后选择您不想要的列之后的 n 列?不只是一个简单的删除列 n 函数吗?
我没有一个例子,因为它更多是一个好奇的问题,但如果有必要,我可以画一个。
我想用'_'替换每行末尾的每个空格字符。我发现了一个类似的问题和答案,用于引导空白。但未能为尾随空格重建它。这是链接:https : //stackoverflow.com/questions/9222281/replace-leading-whitespace-with-sed-or-similar
如果有人能想到更快或更好的方法,那也太好了。我也很欣赏好的解释,因为这样我学得更快:)
Input:
foo bar
foo bar oof
line 3a
line fo a
Output:
foo bar_____
foo bar oof
line 3a___
line fo a_
Run Code Online (Sandbox Code Playgroud) 我需要一个命令来删除文本文件中的任何列,如果它们在列(具有不同行数的列)中有 =>${MaxAllowedNumberOfFs} 'F's 。
我有一些接近的伪代码,但我不知道如何设置匹配数限制器。
假设限制器设置为 3,示例输入文件是:
F G F H H
G F F F A
F G F F F
F F F T F
Run Code Online (Sandbox Code Playgroud)
那么所需的输出将是:
G H H
F F A
G F F
F T F
Run Code Online (Sandbox Code Playgroud)
接近的伪代码(限制器可以并且会根据文件而改变):
MaxAllowedNumberOfFs="1012"
Count_of_columns=`awk '{print NF}' filename | sort -nr | sed -n '$p'`
for((i=1;i<=$Count_of_columns;i++)); do awk -v i="$i" -v x="$MaxAllowedNumberOfFs" '$i == F =>x number of times {$i="";print $0}' filename; done
Run Code Online (Sandbox Code Playgroud)
显然,我可以使用 grep 遍历所有列,计算列中出现的次数,然后删除不符合条件的列。但这真的很慢。真的想要一个漂亮的 awk 命令,但我没有 awk 技能
似乎有许多简洁的方法可以使用 awk 的 printf 甚至 bash 的 printf 将列中的所有数字四舍五入到小数点后一位。但是,我找不到一种同样简单的方法来将列中的所有数字减少到小数点后一位(但不是四舍五入)。目前最简单的排序方法是四舍五入到 2 个小数位,然后从第 1 列的每一行中删除最后一个字符。有人有更好的方法吗?示例输入和输出如下:
输入
123.434
1456.8123
2536.577
345.95553
23643.1454
Run Code Online (Sandbox Code Playgroud)
输出
123.4
1456.8
2536.5
345.9
23643.1
Run Code Online (Sandbox Code Playgroud) 我正在尝试对一个非常大的文件中的每一列进行数字排序。我需要命令速度很快,所以我尝试在 awk 命令中执行此操作。
示例输入:
1,4,2,7,4
9,2,1,1,1
3,9,9,2,2
5,7,7,8,8
Run Code Online (Sandbox Code Playgroud)
示例输出:
1,2,1,1,1
3,4,2,2,2
5,7,7,7,4
9,9,9,8,8
Run Code Online (Sandbox Code Playgroud)
我做了一些可以完成这项工作的东西(但它不是我需要的强大的 awk 命令):
for i in $(seq $NumberOfColumns); do
SortedMatrix=$(paste <(echo "$SortedMatrix") <(awk -F ',' -v x=$i '{print $x}' File | sort -nr) -d ,)
done
Run Code Online (Sandbox Code Playgroud)
但它很慢!
我试过在 awk 中做到这一点,我想我很接近:
SortedMatrix=$(awk -F ',' 'NR==FNR {for (i=1;i<=NF;i++) print|"sort -nr"}' File)
Run Code Online (Sandbox Code Playgroud)
但它不输出列(只是一个很长的列),我明白为什么这样做但我不知道如何解决它,我想在 awk 中使用 paste 但我不知道如何实现它。
有谁知道如何在 awk 中做到这一点?任何帮助或指导将不胜感激
我无法弄清楚为什么sort不能正常工作,但它是根据我告诉它不要这样做的列进行排序的。我想先按第 3 列按优先级排序,然后按第 4 列、第 5 列、第 6 列进行排序。这是怎么回事?
这是我的代码:sort -n -s -t ',' -k3,6
这是我的输入:
a1,b1,2,15,50,ABBA
a1,a1,2,26,55,ABBA
a11,2a1,2,33,55,ABBA
b1,a1,2,80,99,ABA
c2,a1,3,20,40,CAN
a1,b2,3,51,300,CAN
a3,a3,4,1000,2000,ART
d3,c3,4,1700,2050,ART
d3,c2c,4,1600,2050,ART
b1,a3,4,1800,2051,ART
Run Code Online (Sandbox Code Playgroud)
这是我当前的输出:
a1,b1,2,15,50,ABBA
a1,a1,2,26,55,ABBA
a11,2a1,2,33,55,ABBA
b1,a1,2,80,99,ABA
c2,a1,3,20,40,CAN
a1,b2,3,51,300,CAN
a3,a3,4,1000,2000,ART
d3,c3,4,1700,2050,ART
d3,c2c,4,1600,2050,ART
b1,a3,4,1800,2051,ART
Run Code Online (Sandbox Code Playgroud)
但我想要的和预期的输出应该是:
a1,b1,2,15,50,ABBA
a1,a1,2,26,55,ABBA
a11,2a1,2,33,55,ABBA
b1,a1,2,80,99,ABA
c2,a1,3,20,40,CAN
a1,b2,3,51,300,CAN
a3,a3,4,1000,2000,ART
d3,c2c,4,1600,2050,ART
d3,c3,4,1700,2050,ART
b1,a3,4,1800,2051,ART
Run Code Online (Sandbox Code Playgroud)
我正在使用Linux。
我正在尝试使用 grep 从文本文件中获取特定范围的行;行范围需要由两个变量来标识。到目前为止,我一直在尝试使用通配符 '*' 尝试失败的例子包括:(我明白为什么前两个不应该工作)
grep "$Var1"*"$Var2" file.txt
grep "$Var1*$Var2" file.txt
echo "$Var1*$Var2" | grep file.txt
Run Code Online (Sandbox Code Playgroud) 有类似的问题,但没有一个完全解决我遇到的问题。
简而言之,我需要打印包含我要查找的任何字符串的每个块。每个块起始行包含: <entry version=
欲了解更多详情,请参阅下文:
如果在模式区域(块)内识别出某个字符串,我想搜索打印模式之间的每个整个区域(块)的大型文件(数十万行)。
我知道我可以打印模式之间的整个区域,其中这些块的开始和结束标识符是“/<entry version=”,使用:
awk '/<entry version=/{flag=1} flag; /<entry version=/{flag=0}'
但是如果在这些模式之间找到某些字符串,如何让它只打印整个块?
对于块区域来说,真实数据的最短部分看起来像这样(尽管实际上每个块都有数千行长),我要感谢 Terdon 整理了一个更好的示例供我使用:
<entry version="21.1" url="http://v21.proteinatlas.org/ENSG00000000003">
<name>TSPAN6</name>
<synonym>T245</synonym>
<synonym>TM4SF6</synonym>
<synonym>TSPAN-6</synonym>
<identifier id="ENSG00000000003" db="Ensembl" version="103.38" assembly="GRCh38.p13" gencodeVersion="37">
<xref id="O43657" db="Uniprot/SWISSPROT"/>
<xref id="7105" db="NCBI GeneID"/>
</identifier>
<proteinClasses>
<proteinClass source="MDM" id="Ma" parent_id="" name="Predicted membrane proteins"/>
Run Code Online (Sandbox Code Playgroud)
在上面的真实格式中,我将检查特定字符串的名称和同义词,因此如果我正在寻找“TSPAN6”,那么将打印该块。每个块都有数千行,因此下面只是一个虚构的迷你版本,用于解释我如何根据块内的字符串匹配来打印块。
这是一个示例,如果我的字符串是“MEMSAT”和“TNMD”
示例输入:
<entry version="21.1" url="http://v21.proteinatlas.org/ENSG00000000003">
<name>TSPAN6</name>
<synonym>T245</synonym>
<synonym>TM4SF6</synonym>
<synonym>TSPAN-6</synonym>
<identifier id="ENSG00000000003" db="Ensembl" version="103.38" assembly="GRCh38.p13" gencodeVersion="37">
<xref id="O43657" db="Uniprot/SWISSPROT"/>
<xref id="7105" db="NCBI GeneID"/>
</identifier>
<proteinClasses>
<proteinClass source="MDM" id="Ma" parent_id="" name="Predicted membrane proteins"/>
<proteinClass …Run Code Online (Sandbox Code Playgroud) 我见过类似的问题但不是相同的问题,如何从脚本中将特定窗口的大小调整为屏幕上的特定大小和位置?我已经看到了 Resize 和 Printf 的使用,但没有任何效果。它是什么类型的窗户有关系吗?
这是在 Ubuntu Linux 中,运行 bash 脚本,并使用 gnome 打开窗口。目的是管理 GUI 窗口的大小和它弹出的位置。
H、我想替换所有行中的特定字符匹配(.),以第一行作为参考
我试图重新散列一个答案,但我遇到了一个不同的问题:
awk -F'|' 'BEGIN{OFS=FS} NR==1 {for(i=1;i<=NF;i++) a[$i] } NR>1 {for(i in a) if( $i == "\." ) $i="a"}1'
Run Code Online (Sandbox Code Playgroud)
...我在上面的代码中尝试重新工作的想法是将第一行字符存储在'a'中,然后在看到'.'时 在行> 1 中更改 '.' 到存储在'a'中的相应列字符。但它不起作用。
输入:
A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
.|C|G|A|T|T|.|.|G|C|.|.|.|A|C|R|C|.|T|T
A|.|.|.|N|.|T|T|N|.|.|A|C|.|.|R|.|.|.|.
Run Code Online (Sandbox Code Playgroud)
期望输出:
A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
A|C|G|A|T|T|T|P|G|C|Q|A|R|A|C|R|C|V|T|T
A|N|G|O|N|T|T|T|N|C|Q|A|C|A|S|R|U|V|T|T
Run Code Online (Sandbox Code Playgroud)