将特定行的特定位置处的单词打印到新文件中的脚本

将特定行的特定位置处的单词打印到新文件中的脚本

下面是应从特定行和特定位置复制数据的文件

 CP        I  ({010010010010010010010010010010}000 000)  234764-CTS_fsdfs_a_inv_33ghf/ZN
 ---       I  ({111100011111100000000000011100}111 111)  2518255-
 Q         O  ({001111100011111100000000000011}111 **1**11)  2520618-
 
  AP        I  ({010010010010010010010010010010}010 010)  23499764-fdsf_ccl_a_inv_3330gg/XX
 ---       I  ({111111111111111111111100000011}000 000)  2518255-
 Q         O  ({011111110011111111111111100000}000 **0**00)  2909918-

 QP        I  ({110010010010010010010010010010}010 010)  234764-ZZZ_ccl_a_inv_33305/ZZ
 ---       I  ({111111111111111111111100000011}000 000)  2518255-
 Q         O  ({011111111111111111111111100000}000 **1**11)  2599918-

注意:原始文件中不存在 **,它只是为了帮助识别要打印到新文件中的数字

我必须只打印 Q 行的粗体字母。并将内容逐行保存到新文件中。并且请建议一些没有 $3 类型命令的代码,因为在使用带有 $3 的 awk 命令时它会给出如下错误:

can't read "3": no such variable

非常感谢您的帮助

答案1

你可以尝试这样的事情:

awk '$1=="Q"{split($4,a,""); print a[1]}' input_file >new_file

这个想法是split对自己元素中的每个字符使用空分隔符。

另外按照建议您可以使用

awk '$1=="Q"{print substr($4,1,1)}' input_file >new_file

答案2

假设没有任何行有任何初始空格(问题中的行似乎在开头有可变数量的空格,但我假设这是由于不小心的复制和粘贴)并且格式以其他方式固定关于字段的宽度等:

$ cut -c 1,2,51 file | sed -n 's/^Q //p'
1
0
1

这会从每行中提取前两个字符和第 51 个字符。前两个字符用于sed确定要输出的行(删除前两个字符后)。第 51 个字符是您要查找的数字。

或者(可能更简单),使用grepand cut

$ grep '^Q ' file | cut -c 51
1
0
1

在这里,使用 提取有趣的行grep,然后使用 提取每行中的第 51 个字符cut。同样,这仅在文件格式具有固定宽度字段且没有初始空格的情况下才有效。

相关内容