Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 有选择地用空格和空格重新格式化文件\n_Bash_Text Processing - Fatal编程技术网

Bash 有选择地用空格和空格重新格式化文件\n

Bash 有选择地用空格和空格重新格式化文件\n,bash,text-processing,Bash,Text Processing,我有以下格式的多个文件。这一个有3个序列(所有文件中的序列数量不同,但始终以“.”结尾),每个序列有40个位置,如第一行中的数字所示。从行的开头(第一行除外)有序列的名称: 3 40 00076284. ATGTCTGTGG TTCTTTAACC 00892634. TTGTCTGAGG TTCGTAAACC 00055673. TTGTCTGAGG TCCGTGAACC GCCGGGAACA TCCGCAAAAA ACCGTGAAAC GGGGT

我有以下格式的多个文件。这一个有3个序列(所有文件中的序列数量不同,但始终以“.”结尾),每个序列有40个位置,如第一行中的数字所示。从行的开头(第一行除外)有序列的名称:

3 40
00076284. ATGTCTGTGG TTCTTTAACC 
00892634. TTGTCTGAGG TTCGTAAACC 
00055673. TTGTCTGAGG TCCGTGAACC 

          GCCGGGAACA TCCGCAAAAA
          ACCGTGAAAC GGGGTGAACT
          TCCCCCGAAC TCCCTGAACG
我需要将其转换为这种格式,其中序列是连续的,没有空格nor\n,并且在其名称后的新行上。应该保留的唯一空格是第一行中两个数字之间的空格

3 40
00076284. 
ATGTCTGTGGTTCTTTAACCGCCGGGAACATCCGCAAAAA
00892634. 
TTGTCTGAGGTTCGTAAACCACCGTGAAACGGGGTGAACT
00055673. 
TTGTCTGAGGTCCGTGAACCTCCCCCGAACTCCCTGAACG
尝试删除空格和\n,但不知道如何在第一行之后应用它,以及如何避免生成一个大行


谢谢

我想这应该行得通,但我的输出会更长,因为如果我真的把最后的“孤立”序列都压缩了,我会得到更长的一行

cat input.txt  | awk '/^[0-9]+ [0-9]+$/{printf("%s\n",$0); next} /[0-9]+[.]/{ printf("\n%s\n",$1);for(i=2; i<=NF;i++){printf("%s",$i)}; next} /^ */{ for(i=1; i<=NF;i++){printf("%s",$i)}; next;}'
3 40

cat input.txt | awk'/^[0-9]+[0-9]+$/{printf(“%s\n”,$0);next}/[0-9]+[.]/{printf(“\n%s\n”,$1”);for(i=2;i这里有一个shell脚本,可以提供您需要的内容:

head -1 input
awk '
NR == 1 {  sequences = $1 ; positions = $2 ; next }
{ 
  if ( $1 ~ /^[0-9]/ ) {
    sid = $1 ; $1 = "" ; sequence_name[ NR - 1 ] = sid 
    sequence[ NR - 1 ] = $0
  } else {
    sequence[ ( NR - 1 )  % ( sequences + 1 ) ]  = sequence[ (NR-1) % ( sequences + 1 ) ] " " $0
  }
}
END {
  for ( x = 1 ; x <= length( sequence_name ) ; x++ )
  {
    print sequence_name[x]
    print sequence[x]
  }
}' input | tr -d ' ' 
head-1输入
awk'
NR==1{序列=$1;位置=$2;下一个}
{ 
如果($1~/^[0-9]/){
sid=$1;$1=“”;序列名称[NR-1]=sid
序列[NR-1]=$0
}否则{
序列[(NR-1)%(序列+1)]=序列[(NR-1)%(序列+1)]”“$0
}
}
结束{

对于(x=1;x记住空行的位置,并将空行前的行与空行后的行合并:

awk '
   NR==1{print;next}
   NR!=1 && !empty{arr[NR]=$1 "\n" $2 $3}
   /^$/{empty=NR-1;next}
   NR!=1 && empty{printf "%s%s%s\n", arr[NR-empty], $1, $2}
' file 
我的第二个解决方案没有
awk
:使用空行作为分隔符将文件与其自身合并

cat >file <<EOF
3 40
00076284. ATGTCTGTGG TTCTTTAACC 
00892634. TTGTCTGAGG TTCGTAAACC 
00055673. TTGTCTGAGG TCCGTGAACC 

          GCCGGGAACA TCCGCAAAAA
          ACCGTGAAAC GGGGTGAACT
          TCCCCCGAAC TCCCTGAACG
EOF

head -n1 file
paste <(sed -n '1!{ /^$/q;p; }' file) <(sed -n '1!{ /^$/,//{/^$/!p}; }' file) |
sed 's/[[:space:]]//g; s/\./.\n/'
:

  • head-n1文件
    输出第一行
  • sed-n'1!{/^$/q;p;}文件
    • 1!
      -不要输出第一行
    • /^$/q
      -空行时退出
    • p
      打印所有其他内容
  • sed-n'1!{/^$/,//{/^$/!p};}文件
    • 1!
      -忽略第一行
    • /^$/,//
      -从空行到结尾
    • /^$/!p
      -如果不是空的T行,则输出

  • 粘贴输入的其余部分会发生什么?那里有三行会无缘无故地冒烟。最后三行会与其对应的序列合并。作为参考,您可以看到第一个合并序列以AAAAA结尾。唯一的细节是我需要第一行保持不变。您知道如何做吗?除了t、 很好的解决方案!就是这样。谢谢@Mark
    
    3 40
    00076284.
    ATGTCTGTGGTTCTTTAACCGCCGGGAACATCCGCAAAAA
    00892634.
    TTGTCTGAGGTTCGTAAACCACCGTGAAACGGGGTGAACT
    00055673.
    TTGTCTGAGGTCCGTGAACCTCCCCCGAACTCCCTGAACG