如果大小写匹配,Bash会将行附加到lastline

时间:2012-09-19 13:04:45

标签: bash sed awk

我得到了一个像这样的输入:

ha  lo 
ha
ha  lo
ha
ha
ha  lo

如果第二行中不包含字符串“lo”,我如何将该行附加到最后一行。之后看起来应该是这样的

haha
hahaha
ha

我觉得这个很棘手。很高兴能用sed或awk做到这一点。

3 个答案:

答案 0 :(得分:3)

awk '
    $2 == "lo" {if (line) print line; line = ""} 
    {line = line $1} 
    END {print line}
' filename

这有点简单,但你得到一个领先的空白行

awk '$2 == "lo" {print ""} {printf("%s", $1)} END {print ""}'

答案 1 :(得分:3)

这是GNU sed的一种方法:

parse.sed

/ +lo/! H          # Append to HS if / +lo/ doesn't match
/ +lo/ {           # If it does match
  s/ *lo//         # remove it
  x                # put the rest in HS and contents of HS in PS
  s/\n//g          # Remove all newlines from PS
  /./! t end       # If PS empty jump to end
  p                # otherwise print
  s/.*//           # and empty it
}

$ {                # If last line
  x                # swap PS/HS
  s/\n//g          # remove newlines
  p                # and print PS
}
: end

使用以下命令运行:

sed -nr -f parse.sed < infile

输出:

haha
hahaha
ha

答案 2 :(得分:0)

这是另一种方式

其中file.txt包含上述条目

 i=0;IFS=$'\n'; for line in `cat file.txt`; do ((i++)); if [[ [$line =~ lo ]]; then if [ $i -eq 1 ];then ha=$(echo "$line"|awk '{print $1}'); echo -n $ha; else echo; ha=$(echo "$line"|awk '{print $1}'); echo -n  $ha; fi else echo  -n "$line"; fi done; echo

哈哈 哈哈哈 公顷