将文件中的特定列提取为逗号分隔的字符串

时间:2015-03-19 10:00:15

标签: bash shell sed

我需要创建一个SED命令来修改输入文件,其中包含下面解释的一些条件。

我的输入文件如下所示。

列出项目

Rad# ; ID_KEY ; UNIT_ID ; ORGA_ID
1  ; 30000000004 ; 8417920 ; 0001
2  ; 30000000004 ; 8170811 ; 0001
3  ; 30000000004 ; 7709260 ; 0001
4  ; 30000000004 ; 20145598 ; 0001
5  ; 30000000004 ; 1661503 ; 0001
6  ; 30000000004 ; 1445852 ; 0001
7  ; 30000000004 ; 2480684 ; 0001
8  ; 30000000004 ; 8278636 ; 0001
9  ; 30000000004 ; 20102078 ; 0001
10  ; 30000000004 ; 1581292 ; 0001
11  ; 30000000004 ; 20574348 ; 0001
12  ; 30000000004 ; 8057248 ; 0001
----
----
----
98  ; 3000000000 ; 6830310 ; 0007
99  ; 3000000000 ; 7880497 ; 0007
100  ; 3000000000 ; 597529 ; 0007
101  ; 3000000000 ; 702884 ; 0008
----
----
998  ; 3000000000 ; 7907220 ; 0009
999  ; 3000000000 ; 20311746 ; 0007
1000  ; 3000000000 ; 6466985 ; 0007
1001  ; 3000000000 ; 8285052 ; 0007

以下是我需要对此文件执行的一些操作:

  1. 完全删除第1行
  2. 对于其余行,我只需保留第2和第3分号之间的数字。
  3. 我需要在上面步骤2中保留的所有数字之间添加逗号,并将其输出到单行,最后一个数字末尾没有逗号(我想将其用作过滤器WHERE IDS IN (<Result>)中另一个sql的输入)。
  4. 另请注意,我想将输出写入另一个文本文件(创建新文件,或者我可以在与输入文件相同的位置创建一个空文件)或修改相同的输入文件。

    我还必须让输出文件只包含一个数字后跟逗号。类似的东西:

    列出项目

    8417920,
    8170811,
    --
    8285052 
    

2 个答案:

答案 0 :(得分:1)

这可以在awk中很好地完成,看起来非常清楚:

$ awk -v OFS="," 'NR>1 {f=(f?f OFS:"")$5} END {print f}' file
8417920,8170811,7709260,20145598,1661503,1445852,2480684,8278636,20102078,1581292,20574348,8057248,6830310,7880497,597529,702884,7907220,20311746,6466985,8285052

解释

  • -v OFS=","将输出字段分隔符设置为逗号。
  • NR>1 {}要从第二行完成的事情。
  • f=(f?f OFS:"")$5在变量f中存储所有需要的输出。如果它是第一次附加,只需使用第5个字段;否则,请使用以前存储的内容。
  • END{}处理整个文件后要做的事情。
  • print f打印存储的字符串。

更新

  

我还必须让输出文件只包含一个数字   然后是逗号。

$ awk -v OFS="," 'NR>1 {if (f) print f OFS; f=$5} END {print f}' file
8417920,
8170811,
7709260,
...
7907220,
20311746,
6466985,
8285052

存储上一行并将其与逗号一起打印。最后,打印最后一个但没有逗号。

答案 1 :(得分:0)

尝试以下方法:

sed -n '2~1{s/[^;]*;\([^;]*\);.*/\1,/;H;}; $x;$s/\n//g;s/,$//;$w foo.txt'

阐释:

  • -n告诉sed不要为每一行打印模式空间
  • 2~1告诉sed为以2
  • 开头的每一行执行以下命令
  • s/[^;]*;\([^;]*\);.*/\1,/获取;
  • 中的第二个文字
  • H追加持有空间
  • 最后
  • $
  • x交换持有空间和模式空间
  • s/\n//g删除所有换行符
  • s/,$//删除最后一个逗号
  • w foo.txt将模式空间写入foo.txt