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

Extract specific column from a file into a comma separated string

我需要创建一个 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. 完全删除第一行
  2. 对于其余行,我只需要保留第 2 和第 3 个分号之间的数字。
  3. 我需要在上面第 2 步保留的所有数字之间添加逗号,并将其输出到最后一个数字末尾没有逗号的单行(我想将它用作另一个 sql 中的输入过滤器 WHERE IDS IN (<Result>)) .

另请注意,我想将输出写入另一个文本文件(创建新文件,或者我可以在与输入文件相同的位置创建一个空文件)或修改相同的输入文件。

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

列表项

8417920,
8170811,
--
8285052 

这可以在 awk 中以一种看起来很清楚的方式很好地完成:

$ awk -v OFS="," 'NR>1 {f=(f?f OFS:"")} 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 {} 从第 2 行开始做的事情。
  • f=(f?f OFS:"") 将所有需要的输出存储在变量 f 中。如果是第一次追加,就用第5个字段;否则,使用之前存储的内容。
  • END{} 处理完整个文件后要做的事情。
  • print f 打印存储的字符串。

更新

I also have to have the output file to contain only one number followed by comma.

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

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

尝试以下操作:

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

解释:

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