将文件中的特定列提取为逗号分隔的字符串
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
下面是我需要对这个文件做的几件事:
- 完全删除第一行
- 对于其余行,我只需要保留第 2 和第 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
我需要创建一个 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
下面是我需要对这个文件做的几件事:
- 完全删除第一行
- 对于其余行,我只需要保留第 2 和第 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 和形态 spaces/\n//g
删除所有换行符s/,$//
删除最后一个逗号w foo.txt
将模式 space 写入 foo.txt