Linux命令从不以数字开头的文件中筛选记录



我在linux中有一个文件。

它有许多记录

第一条记录是页眉,一些记录有数据记录,最后一条记录是页脚记录

records.txt

1MJ M062021
JKYCNY  MJ   0621 0000000002 00000001000 00000000100
MYFCNT  MJ   0621 0000000003 00000003000 00000000100
JKYCNY  MJ   0621 0000000004 00000010000 00000000100
JKYCNY  MJ   0621 0000000005 00000025000 00000000100
aYFCNT  MJ   0621 0000000006 00000001000 00000000100
JKYCNY  MJ   0621 0000000007 00000003000 00000000100
MYFCNT  MJ   0621 0000000008 00000010000 00000000100
JKYCNY  MJ   0621 0000000009 00000005000 00000000100
JKYCNY  MJ   0621 0000000010 00000010000 0000000010
JKYCNY  MJ   0621 0000043199 00000000100 00000000100
JKYCNY  MJ   0621 0000043200 00000000100 00000000100
9000000000042723

我只想要数据记录,我想跳过头记录和尾记录,有时在这个文件中不会有头记录。

我只想获取数据记录,并将结果存储为文件

下面的命令只给我页眉和页脚记录,

grep "^[1,9]" records.txt

但是单独跳过这两条记录的命令是什么,我尝试了下面的命令,但对没有帮助

grep "!^[1,9]" records.txt

[1,9]的意思是";字符19之一。你可能不是这个意思。也许你指的是[19](一或九(,也可能是[0-9](任何数字(。我猜想你的意思是";任何数字";因为你在标题里就是这么说的。如果你的意思是其他的,我希望它将是显而易见的如何修复它。

要反转可以匹配的字符集,请在[后面放一个^。所以CCD_ 6的意思是";除了数字以外的任何东西";。

模式开始处的CCD_ 7表示";只在一行的开头匹配";。但这只意味着在模式开始时。

所以^[^0-9]匹配一个以数字以外的东西开头的行。

这两种模式都不匹配空行,因为它们都只匹配一个字符。

通常,grep会在一行中的任何位置搜索该模式,如果找到该模式,则会打印该行。但是,如果在模式的开头放一个^,它只检查行的开头。你也可以在模式的末尾放一个CCD_;只在行的末尾匹配";。如果在开头同时使用^,在结尾同时使用$,则要求grep打印与模式精确匹配的行。对于这个问题,你不需要知道这些,但总有一天它会派上用场的。

尝试grep "^[^19]" records.txt

类似的东西

grep -v '^[0-9]'

这会将第一个字符不是数字的所有行写入stdout。

所有的答案似乎都很好。只是想添加另一个选项。sed

sed -En '/^([[:alpha:]]+s+)+/p' records.txt

就地写入并创建备份:

sed -Eni.bak '/^([[:alpha:]]+s+)+/p' records.txt

您正在讨论删除页眉和页脚。为此(只是去掉页脚(,我做了一个小的oneliner:

head -n $(($(wc -l test.txt | awk '{print $1}') - 1)) test.txt

显然,这太复杂了。请随意简化。

这就是它的意思:

wc -l test.txt     : count the amount of lines (and in the result,
show also the filename)
| awk '{print $1}' : only show the amount of lines, not the filename
$((... - 1))       : subtract 1
head -n ...        : show the first ... entries of the file. As that amount
equals the number of lines minus one, it shows
everything but the footer.

最新更新