从文件中的特定行中创建新列?

时间:2019-04-23 23:02:16

标签: unix awk sed

我正在尝试解决以下问题,但是几次尝试都未能解决问题。

假设我的文件中包含以下内容:

a,b,c

d,e,f

g

h

我需要某种方式将g和h添加为第三列,以便文件看起来像这样:

a, b, c, g

d, e, f, h

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

如果“ d”文件中的数据,请在gnu awk上尝试:

awk -F, '$0~/\S/ {if(NF>1) {m[++i]=$0} else {n[++j]=$0}} END{for(;c++<i;){print m[c]","n[c]}}' d

答案 1 :(得分:1)

请注意,我理解您的问题是关于如何将第3行连接到第1行的末尾,如何将第4行连接到2的末尾,然后将第7行连接到5的末尾,以及如何将8连接到6的末尾,依此类推。

我假设您确实有一个输入文件,例如:

schema_version

如果文件确实是双倍间距的,则可以使用以下命令对其进行修复:

a,b,c
d,e,f
g
h

然后将第二行连接到前面的第二行:

sed '/./!d' FILE

如果您愿意,我很高兴进一步解释此代码。

此外,如果您需要处理文件包含奇数行的可能性,例如

cat FILE | sed '/./!d' | awk '
  BEGIN {
    d[0] = ""; d[1] = ""
  }
  {
    n = NR % 2
    if (d[n] == "")
      d[n] = $0
    else {
      print d[n] "," $0
      d[n] = ""
    }
  }
  '

在您的AWK中添加一个END块:

a,b,c 
d,e,f
g
h
x,y,z

答案 2 :(得分:0)

我还不清楚如何概括您的问题。 (即,您想对8行文件做什么?),但是对于您似乎想交换第二行和第三行并粘贴的特殊情况,可以使用:

perl -e 'chomp (my @ar =<>); @ar[1,2] = @ar[2, 1]; map { $_ .= ($i++%2 ? "\n" : ",")} @ar; print @ar' input

也许您可以对其进行修改以适合您的需求。