【问题标题】:Remove column awk删除列 awk
【发布时间】:2017-03-07 07:23:41
【问题描述】:

我有输入文件:

HEADER 1     |  HEADER 2   |  HEADER 3      |  HEADER 3   | HEADER 4       |
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|

我希望我的文件是这样的:(包含 3 个带有标题和尾部的拆分文件,并删除前 3 列

DETAIL 07032017
 HEADER 1    |  HEADER 2      |       
1356438284972|1356438292151693|
EOF 3

DETAIL 07032017
 HEADER 1    |  HEADER 2      |
1356438284972|1356438292151693|
EOF 3

DETAIL 07032017
 HEADER 1    |  HEADER 2      |
1356438284972|1356438292151693|
EOF 3

至于我目前的命令;

awk -v date="$(date +"%d%m%Y")" -F\| 'NR==1 {h=$0; next} 
{file="FILE_"$1"_"$2"_"date".csv";  
print (a[file]++?"": "DM9 "date"" ORS h ORS) $0> file} END{for(file in a)     
print "EOF " a[file] > file}' testing.csv

我只能得到(如上面的命令)我可以拆分文件,添加标题和尾部但还没有删除列

DETAIL 07032017
 HEADER 1    |  HEADER 2   |  HEADER 3      |  HEADER 3   | HEADER 4       |
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693| 
EOF 3

DETAIL 07032017
 HEADER 1    |  HEADER 2   |  HEADER 3      |  HEADER 3   | HEADER 4       |
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693| 
EOF 3

DETAIL 07032017
 HEADER 1    |  HEADER 2   |  HEADER 3      |  HEADER 3   | HEADER 4       |
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|
EOF 3

上述命令仅用于拆分,添加带有记录数的标题和尾部。

但我想在拆分后删除前 3 列并添加标题拖车。有可能吗?

或者我需要拆分然后删除,只有最后一个做标题和拖尾?

我试试这个;

awk -v date="$(date +"%d%m%Y")" -F\| 'NR==1 {h=$0; next} 
{file="FILE_"$1"_"$2"_"date".csv";  
print (a[file]++?"": "DM9 "date"" ORS h ORS)**substr($0, index($0,$4))**>             file} END{for(file in a) print "EOF " a[file] > file}' testing.csv

我使用了 substr 但根本不起作用。

我想删除前 3 列

【问题讨论】:

    标签: awk split gsub substr


    【解决方案1】:

    正如我在上一篇文章中所写,您可以使用 substr($0, index($0,$4)) 删除第 1 到第 3 列。 您上面的示例文件缺少标题,所以我添加了一个标题来进行测试。

    下面的测试结果应该符合您的预期。

    如果在您的机器上这不起作用,则可能是您的 PC 有所不同。

    echo "cat data.csv"
    cat data.csv
    echo "awk - started "
    awk -v date="$(date +"%d%m%Y")" -F"|" 'NR==1 {h=substr($0, index($0,$4)); next} \
    {file="FILE_"$1"_"$2"_"date".csv";print (a[file]++?"": "DM9 "date"" ORS h ORS) substr($0, index($0,$4)) >file } \
    END{for(file in a) print "EOF " a[file] >file}' data.csv
    echo "awk - finished "
    echo "csv file generated:"
    cat FILE*.csv
    echo "script finish"
    
    #Terminal Output:
    cat data.csv
    Header1|Header2|Header3|Header4|Header5|
    1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693| 
    1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|
    1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|
    awk - started
    awk - finished
    csv file generated:
    DM9 07032017
    Header4|Header5|
    1356438284972|1356438292151693|
    1356438284972|1356438292151693|
    1356438284972|1356438292151693|
    EOF 3
    script finish 
    

    【讨论】:

    • @Jiji 正如您所见,在 Red Hat Linux 中运行良好。上网试试看你自己。你的系统是什么 - 你的 awk 版本是什么?是 MAC,是 BSD,还是 Debian?终端中uname -aawk --version 的输出是什么? PS:我还必须从标题中删除前三列以使输出文件看起来不错。
    • @Jiji 提出的删除前三列的解决方案在其他机器上运行良好,例如带有 GNU awk 的 Red Hat(请参阅我的回答中的在线测试 - 按照我提供的链接并观看您的前三列消失) .您需要告知您使用的是什么机器以及您使用的是什么 awk 版本。
    • 我用putty或者linux机器
    • 您编辑了问题以删除前三列。正如这个答案和我给你的链接一样。按照链接查看您的列是如何被删除的。如果您想为我发布 cmets,请在此处发布,而不是在其他帖子中。关于 awk 版本,只需告诉我们您的终端在您编写 awk --version 时所说的内容
    • 嗨@GeorgeVasiliou,我在编码之前有过你之前给我的问题。如果我想删除前三列。如果我的第二列名称是 Project_Today 和第三列今天。它将削减我的第二列。哪个project_和今天一样。是不是字符串问题?
    【解决方案2】:

    试试这个 -

        awk -v date="$(date +"%d%m%Y")" -F\| 'BEGIN{print "DETAIL " date} {print $4,$5FS} END {print "EOF " NR}' OFS="|"  f
    DETAIL 07032017
    1356438284972|1356438292151693|
    1356438284972|1356438292151693|
    1356438284972|1356438292151693|
    EOF 3
    

    【讨论】:

    • {print $4,$5FS} 这是干什么用的?我从第 4 列得到但不完全。顺便说一句,我想在一个命令中进行拆分、标题、拖车和删除列。是否可以?您的命令仅适用于标题、拖车和删除列。您的命令中不包含拆分
    • 我的问题
    • 试试这个 - awk -v date="$(date +"%d%m%Y")" -F\| 'NR==1 {h=$0; next} {file="FILE_"$1"_"$2"_"date".csv"; print (a[file]++?"": "DETAIL "date"\n") substr($0, index($0,$4)) > file} END{for(file in a) print "EOF " a[file] > file}' f
    • @Jiji - 我不知道这里的帐号和保单号是什么,请提及输入文件的列号,如果您希望在输出中对其进行格式化,请相应地更改输出文件.
    • 当我使用上述命令时,我的列名丢失了,前 3 列仍然存在...:'( @VIPINKUMAR
    【解决方案3】:
    awk -v Date="$(date +'%d%m%Y')" '
       # print header
       BEGIN { print "DETAIL " Date }
       # prepare new content
          { sub( /([^|][|]){3}/, "") }
       # print new content
       7
       # print footer
       END { print "\nEOF " NR }
       # redirect output to your final file
       ' YourSource > YourFile
    

    【讨论】:

    • 我收到一个错误:awk: cmd. line:5: error: Unmatched ( or \(: /([^|][|]\){3}/.
    • @NeronLeVelu 那么#split ' 在哪里?
    • @Jiji 为什么需要split?您可以在不使用字段的情况下删除字段,例如使用正则表达式或打印您想要的字段 (print $4,$5,$6)?
    • @JamesBrown 因为实际上他有大约 15 列,正如他在其他帖子中声称的那样,而不仅仅是他在本 OP 中展示的 6 列。我想从昨天开始帮助这个人,但没有运气。 (PS:看看他的发帖记录)
    • @GeorgeVasiliou ya 实际上我的命令是用于拆分、添加页眉和拖车,最后一个我需要删除前三列。我设法在我的命令中进行拆分、标题和预告片,但我找不到删除列的方法。我的主管建议我先进行拆分并放入一个命令,然后再进行标题和预告片。是否可以?请大家回复,因为我还是新手,使用 awk。谢谢:)你们的帮助表示赞赏:)
    猜你喜欢
    • 2017-07-21
    • 2017-07-23
    • 2011-12-03
    • 2017-07-26
    • 2013-02-27
    • 2012-05-08
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    相关资源
    最近更新 更多