bash - 从文件中提取特定列到逗号分隔的字符串中

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

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

我还必须让输出文件仅包含一个数字,后跟逗号。像这样的东西:

列出项目

8417920,
8170811,
--
8285052 

最佳答案

这可以在 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 打印存储的字符串。

更新

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=$5} END {print f}' file
8417920,
8170811,
7709260,
...
7907220,
20311746,
6466985,
8285052

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

关于bash - 从文件中提取特定列到逗号分隔的字符串中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29141547/

相关文章:

c - 使用 EOL 模拟 STDIN 输入

bash - Redis:当通过 awk 传递 llen 结果时,谁在吃我的字段?

bash - 我可以在一行 bash 中嵌入命令吗?

C系统函数导致错误 'sh: Syntax error: "("unexpected '

linux - `sed` 有效,但 `sed -i` 返回错误

regex - 如何使用查找结果逐个文件执行 sed?

bash - 引号中的波浪号扩展

linux - Shell命令是用什么语言写的?

linux - 如何在shell中使用正则表达式来匹配文件名?

awk - 在文本文件的第一行和第二行之间添加一个空行