我需要创建一个 SED 命令来修改输入文件,其条件如下所述。
我有一个如下所示的输入文件。
项目清单
Rad# ; ID_KEY ; UNIT_ID
1 ; 30000000004 ; 8417920
2 ; 30000000004 ; 8170811
︙
10 ; 30000000004 ; 1581292
︙
1001 ; 3000000000 ; 8285052
以下是我需要对此文件执行的一些操作:
- 完全删除第一行
- 仅保留以逗号分隔的第二和第三组数字
,DATABASE
在每行末尾附加字符串。
输出应如下所示。
项目清单
30000000004,8417920,DATABASE
30000000004,8170811,DATABASE
答案1
假设问题中的输出是所需的输出,您可以尝试这个。
awk -F';' 'BEGIN{OFS=",";} NR>1{gsub(/ /,""); print $2,$3,"DATABASES"}' filename | sed -e :a -e '$!N;s/\n/,/;ta'
也许只有这样才能完成awk
。sed
如果您希望线条位于同一行,请删除该部分。
由于 SE 似乎具有教育目的,因此我将尽力解释上述命令中每个标志的作用。
-F';'
# 使用;
as --field-separator
BEGIN {OFS=",";}
# 这是一种特殊的模式,它先于后面的任何命令运行,并且它的输出不受程序其余部分的影响。然后我们有ORS
ORS
# 由于输出应包含逗号,,
我们定义Output Record Separator
将逗号作为值。默认值ORS
是换行"\n"
NR>1
# 这里我们说跳过第一条记录。NR
也是一个特殊的保留变量,用于保存输入记录的总数。
gsub()
# 是一个接受一些参数的函数。如果没有指定字段,例如$2
或$3
thengsub()
函数将使用整个记录$0
最后 print $2,$3,"DATABASE"
将打印指定字段并添加DATABASE
到行尾。
print $2,$3
# 这里我们使用逗号来分隔字段。默认FS (Field separator)
分隔符是单个空格' '
。
我希望这个简短的描述能够澄清一些事情。
答案2
我假设您的意思是您希望每一行输入(在标题之后)转换为一行输出(而不是全部在一行上一起运行,如问题的第一个版本所示)。
sed
是完成这项工作的一个非常好的工具;它可以做为
sed -e 1d -e "s/.* ; \(.*\) ; \(.*[^ ]\) */\1,\2,DATABASE/"文件名
在哪里
1d
表示删除第一行,并且-
s/.* ; \(.*\) ; \(.*[^ ]\) */\1,\2,DATABASE/
意味着将每一行(第一行之后)分解为 然后将其替换为 该部分是排除 中的任何尾随空格。
something1 ; something2 ; something3
something2,something3,DATABASE
.*[^ ]
something3
答案3
正如评论中的 awk 解决方案:
awk '{ FS=";"; OFS=","; gsub(/^[ \t]+/, "", $2); gsub(/[ \t]+$/, "", $2); gsub(/^[ \t]+/, "", $3); gsub(/[ \t]+$/, "", $3); } NR > 1 { print $2, $3, "DATABASE" }' file
答案4
我可能会这样做:
cut -d' ' -f3,5 <infile |
sed -n 'y/ /,/;1!s/$/,DATABASE/p'
...因为我认为这可能是解决这个问题的最有效的解决方案。