use*_*373 4 awk shell-script text-processing
我有一个这样的文件,它是一个两列制表符分隔的文件。
CTGCAGTTTCCCCAAATGTGGGAAACTTGACTGTATAATTTGTGGCAGTGGTA a1
GATTTCCCCAAATGTGGGAAACTCACTCGGCAGGCGTTGATA a2
Run Code Online (Sandbox Code Playgroud)
我想得到这样的输出:
>a1
CTGCAGTTTCCCCAAATGTG
GGAAACTTGACTGTATAATT
TGTGGCAGTGGTA
>a2
GATTTCCCCAAATGTGGGAA
ACTCACTCGGCAGGCGTTGA
TA
Run Code Online (Sandbox Code Playgroud)
我试图在awk 中使用 fold 命令。是否可以在其中使用另一个命令awk?
另外,我想要的每条线的宽度是 15,所以我尝试了这样的操作,但没有奏效:
awk -F "\t" '{a=$(fold -w 50 $1);print a,$2}' file.txt
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
这里有几种方法:
珀尔
perl -ane '$F[0]=~s/.{15}/$&\n/g; print ">$F[1]\n$F[0]\n"' file
Run Code Online (Sandbox Code Playgroud)awk
awk '{i=0; printf ">%s\n",$2;
while(i<=length($1)){
printf "%s\n", substr($1,i,15);i+=15
}}' file
Run Code Online (Sandbox Code Playgroud)如果你真的想fold在 awk 中使用,你可以这样做
awk '{printf ">%s\n",$2; system("echo " $1 "| fold -w 15 ") }' file
Run Code Online (Sandbox Code Playgroud)
你的尝试失败了,因为它$()是一个外壳,而不是一个awk东西。要从内部运行系统命令awk,您需要使用system(). 然后,为了传递价值的$1实际字符串(序列),而不是$1在shell(如果你这样做,shell将试图评估它,它会返回一个空白,因为$1没有设置),您需要排除$1从报价。
所以,在这个例子中,我使用
|-------------------------> closing quotes for the 1st part
| |----> closing quotes for the 2nd part
v v
system( " echo " $1 " | fold -w 15")
- ---- --- - ------------
| | | | |----------> the 2nd part
| | | |------------------> opening quotes for the 2nd part
| | |---------------------> The awk variable, `$1`,
| | outside the quotes.
| |-----------------------------> The 1st part
|--------------------------------> opening quotes for the 1st part
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1910 次 |
| 最近记录: |