SED命令格式化文本文件

SED命令格式化文本文件

我需要创建一个 SED 命令来修改输入文件,其条件如下所述。

我有一个如下所示的输入文件。

项目清单

Rad# ; ID_KEY ; UNIT_ID
1  ; 30000000004 ; 8417920 
2  ; 30000000004 ; 8170811 
10  ; 30000000004 ; 1581292
1001  ; 3000000000 ; 8285052

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

  1. 完全删除第一行
  2. 仅保留以逗号分隔的第二和第三组数字
  3. ,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' 

也许只有这样才能完成awksed如果您希望线条位于同一行,请删除该部分。

由于 SE 似乎具有教育目的,因此我将尽力解释上述命令中每个标志的作用。

-F';'# 使用;as --field-separator
BEGIN {OFS=",";}# 这是一种特殊的模式,它先于后面的任何命令运行,并且它的输出不受程序其余部分的影响。然后我们有ORS

ORS# 由于输出应包含逗号,,我们定义Output Record Separator将逗号作为值。默认值ORS是换行"\n"

NR>1# 这里我们说跳过第一条记录。NR也是一个特殊的保留变量,用于保存输入记录的总数。

gsub()# 是一个接受一些参数的函数。如果没有指定字段,例如$2$3thengsub()函数将使用整个记录$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'

...因为我认为这可能是解决这个问题的最有效的解决方案。

相关内容