【问题标题】:Joining lines with awk and sed用 awk 和 sed 连接行
【发布时间】:2012-07-27 06:25:00
【问题描述】:

我喜欢使用 AWK 或 SED 将 {st,corridor,tunnel} 之后的行合并为一行

Input 

abcd 
efgjk
st 
wer
dfgh
corridor 
weerr
tunnel 
twdf

Desired output


abcd  
efgjk st  
wer 
dfgh corridor  
weerr tunnel 
twdf

【问题讨论】:

  • 请问是否真的需要使用 awk 或 sed 来满足您的情况?您是否正在尝试学习 awk 和 sed 技术?还是你只想solve the problem

标签: sed awk


【解决方案1】:

一种使用awk的方式:

awk '!/st|corridor|tunnel/ { if (line) print line; line = $0; next } { line = line " " $0 } END { print line }' file.txt

结果:

abcd 
efgjk st 
wer
dfgh corridor 
weerr tunnel 
twdf

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed '$!N;s/\n\(st\|corridor\|tunnel\)\s*$/ \1/;P;D' file
    

    【讨论】:

      【解决方案3】:

      或者,先将整个文件读入内存的 awk 版本(不推荐用于大文件):

      $ awk 'BEGIN {i=1} {line[i++] = $0} END {j=1; while (j<i) {if (match(line[j+1], /^(st|corridor|tunnel)$/)) {print line[j] " " line[j+1]; j+=2} else print line[j++];}}' streets
      abcd
      efgjk st
      wer
      dfgh corridor
      weerr tunnel
      twdf
      

      我会留给你一次做一两行的练习。 :)

      【讨论】:

        【解决方案4】:

        awk

        BEGIN {
            s["st"]=s["corridor"]=s["tunnel"]
        }
        
        $1 in s {
            print prev, $1
        }
        
        !($1 in s) {
            if (prev) print prev
            prev = $1
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-12
          • 2017-09-02
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-24
          相关资源
          最近更新 更多