Articles of sed

以Y线的间隔提取长度为X的线

我的testing数据 aa1 bb1 cc1 aa2 bb2 cc2 aa3 bb3 cc3 aa4 bb4 cc4 aa5 bb5 cc5 aa6 bb6 cc6 aa7 bb7 cc7 aa8 bb8 cc8 假设我想将第4-6行(aa2-cc2)提取到一个文件中,然后跳过6行,并提取第13-15行(aa5-cc5),然后是同样的6行跳过。 该过程将重复,直到文件结束。 我写了一个bash脚本,适用于小文件。 #!/bin/bash for i in {2..8..3}; do sed -n "$((3*i-2))","$((3*i))"p testdata > "$i".part done 现在我正在处理一个30 GB的巨大文件,我的脚本对硬盘不好,因为它将读取数千次相同的文件。 我希望通过阅读(并提取我的部分)文件只有一次,以避免硬盘损坏。 有没有可以解决我的问题的单线? 我不是一个真正的程序员,所以请忍受任何混淆在我的问题的术语。 感谢您的帮助!

删除文本文件中的奇数行

文件: /home/USER/DIR/a http://www.here.is.a.hyper.link.net/ /home/USER/DIR/b http://www.here.is.another.hyper.link.net/ 需要删除该文件中的所有奇数行( PUBLIC-DIRECTORY-LIST )? 它的批处理脚本,可以在下面find(Dropbox批量puburl创build者): for PATH in `cat LIST` do echo $PATH dropbox puburl $PATH done > PUBLIC-DIRECTORY-LIST 我只是附加命令来修剪脚本的末尾PUBLIC-DIRECTORY-LIST ?

优化grep,awk和sed shell的东西

我试图从“IPCop”的日志文件中总结不同端口的stream量,所以我编写和命令我的shell,但我认为它可以优化命令。 首先从我的日志文件中的一行: 01/00:03:16 kernel INPUT IN=eth1 OUT= MAC=xxx SRC=xxx DST=xxx LEN=40 TOS=0x00 PREC=0x00 TTL=98 ID=256 PROTO=TCP SPT=47438 DPT=1433 WINDOW=16384 RES=0x00 SYN URGP=0 现在我用下面的命令grep包含端口1433的所有长度的总和 grep 1433 log.dat|awk '{for(i=1;i<=10;i++)if($i ~ /LEN/)print $i};'|sed 's/LEN=//g;'|awk '{sum+=$1}END{print sum}' 我需要for循环,因为LEN-COL在任何时候都不在同一个位置。 任何build议优化这个命令? 问候雷内

如何在Linux上使用sed从文件名获取值?

如何从后面的文件名分别检索每个部分? DSA4020_frontcover_20346501_2011-05.doc 我想要检索如下信息; 名称= DSA4020 type = frontcover id = 20346501 date= 2011-05 是否有可能做sed?

Bash引用行为和sed

我写了一个简短的bash脚本,应该从string中去掉前面的tab / spaces: #!/bin/bash RGX='s/^[ \t]*//' SED="sed '$RGX'" echo " string" | $SED 它从命令行工作,但脚本得到这个错误: sed: -e expression #1, char 1: unknown command: `'' 我的猜测是报价有些问题,但我不确定是什么。

拆分包含pipe道字符的string

我正在处理一些包含“||||”字段分隔符的文本: substring1||||substring2 子string也可能包含空格。 我想根据分隔符“||||”拆分这些string,但我找不到一个合适的方法来做到这一点。 我尝试了下面的命令: echo "substring1||||substring2" | awk '{split($0,a,"||||"); a[2],a[1]}' 实际上,如果我只有一个“|” 作为分隔符。 但我的问题是,我有不止一个pipe道字符。 我也试过了 a=($(echo "substring1||||substring2" | sed -e "s/||||/\n/g")) 它工作正常,如果子string不包含空格。 但是由于子string可能包含空格,所以它们也在空格上分开,这是不希望的。 任何想法?

linux:从文件中提取模式

我有一个大的制表符分隔的4列的.txt文件 col1 col2 col3 col4 name1 1 2 ens|name1,ccds|name2,ref|name3,ref|name4 name2 3 10 ref|name5,ref|name6 … … … … 现在我想从这个文件中提取以'ref |'开头的所有内容。 这种模式只在col4中出现 所以对于这个例子,我想作为输出 ref|name3 ref|name4 ref|name5 ref|name6 我想过使用'sed',但是我不知道从哪里开始。

sed,awk或类似的 – 删除整行和上面的2行,如果模式匹配后面跟着一个空行

示例文本: heading1 heading2 data data data heading1 heading2 heading1 heading2 data data data 我想删除中间没有任何数据的部分。 那是; 如果标题2后跟一个空行,则删除标题2,标题1和上面的空白行。 我已经find了如何删除只有当一个空行后面的行,以及如何删除一个模式上方/下方的n行,但不能解决如何合并两个。 谢谢。

更快的解决scheme来比较bash中的文件

文件1: chr1 14361 14829 NR_024540_0_r_DDX11L1,WASH7P_468 chr1 14969 15038 NR_024540_1_r_WASH7P_69 chr1 15795 15947 NR_024540_2_r_WASH7P_152 chr1 16606 16765 NR_024540_3_r_WASH7P_15 chr1 16857 17055 NR_024540_4_r_WASH7P_198 和file2: NR_024540 11 我需要在file1find匹配file2并打印整个file1 + second column of file2 所以ouptut是: chr1 14361 14829 NR_024540_0_r_DDX11L1,WASH7P_468 11 chr1 14969 15038 NR_024540_1_r_WASH7P_69 11 chr1 15795 15947 NR_024540_2_r_WASH7P_152 11 chr1 16606 16765 NR_024540_3_r_WASH7P_15 11 chr1 16857 17055 NR_024540_4_r_WASH7P_198 […]

如何根据给定数量的字母显示单词?

我已经创build了这个基本的脚本: #!/bin/bash file="/usr/share/dict/words" var=2 sed -n "/^$var$/p" /usr/share/dict/words 但是,它不是按要求工作(或者仍然需要更多的逻辑)。 在这里,它应该只打印2个字母的单词,但是这是给出不同的输出 任何人都可以提出如何实现这个与sed或awk的想法?