【问题标题】:awk to print all columns formattedawk 打印所有格式化的列
【发布时间】:2018-11-13 13:36:35
【问题描述】:

我想在未格式化的输入下进行格式化。如果第二列以“2”开头,我想打印所有字段。

实际文件包含许多列。有没有最简单的方法来打印所有列而不是输入 print $2,$3,$4,$5,...$n

输入.csv

---------------------------
|Data statistics|Number of|
|-------------------------|
|Records passed |  750,517|
---------------------------
Transaction Data for Serial Numbers

No of Records :                                                      750517

-----------------------------------------------------------------------------------------------------------
|Material Number|Serial Number From |Serial Number To   |Document Year|Delivery Document|Material Document|
|----------------------------------------------------------------------------------------------------------
|200965         |18604165309338     |18604165309387     |2012         |6100202749       |AAA2778202       |
|201163         |10740000822407     |10740000822606     |2012         |6100202749       |AAA2778202       |
|201232         |18604177741067     |18604177741366     |2012         |6100202749       |AAA2778202       |
|201295         |18604221522337     |18604221523836     |2012         |6100202749       |AAA2778202       |
|201480         |18604113309952     |18604113310131     |2012         |6100202749       |AAA2778202       |
|201781         |18604199150436     |18604199150835     |2012         |6100202749       |AAA2778202       |
|201480         |6001400030046472   |6001400030046771   |2012         |6100202520       |AAA2777953       |
|202853         |6001700000180323   |6001700000180722   |2012         |6100202520       |AAA2777953       |
-----------------------------------------------------------------------------------------------------------

我正在取消以下命令:

awk ' BEGIN {FS ="|"; OFS = ","} { if ($2~"2") print $2,$3,$4,$5,$6,$7 }' Input.txt

期望的输出:

200965         ,18604165309338     ,18604165309387     ,2012         ,6100202749       ,AAA2778202       
201163         ,10740000822407     ,10740000822606     ,2012         ,6100202749       ,AAA2778202       
201232         ,18604177741067     ,18604177741366     ,2012         ,6100202749       ,AAA2778202       
201295         ,18604221522337     ,18604221523836     ,2012         ,6100202749       ,AAA2778202       
201480         ,18604113309952     ,18604113310131     ,2012         ,6100202749       ,AAA2778202       
201781         ,18604199150436     ,18604199150835     ,2012         ,6100202749       ,AAA2778202       
201480         ,6001400030046472   ,6001400030046771   ,2012         ,6100202520       ,AAA2777953       
202853         ,6001700000180323   ,6001700000180722   ,2012         ,6100202520       ,AAA2777953 

【问题讨论】:

    标签: awk pattern-matching


    【解决方案1】:
    $ awk 'gsub(/\|/,",") && gsub(/^,|,$/,"") && /^2/' file
    200965         ,18604165309338     ,18604165309387     ,2012         ,6100202749       ,AAA2778202
    201163         ,10740000822407     ,10740000822606     ,2012         ,6100202749       ,AAA2778202
    201232         ,18604177741067     ,18604177741366     ,2012         ,6100202749       ,AAA2778202
    201295         ,18604221522337     ,18604221523836     ,2012         ,6100202749       ,AAA2778202
    201480         ,18604113309952     ,18604113310131     ,2012         ,6100202749       ,AAA2778202
    201781         ,18604199150436     ,18604199150835     ,2012         ,6100202749       ,AAA2778202
    201480         ,6001400030046472   ,6001400030046771   ,2012         ,6100202520       ,AAA2777953
    202853         ,6001700000180323   ,6001700000180722   ,2012         ,6100202520       ,AAA2777953
    

    在下面解决您的评论:

    $ awk 'gsub(/\|/,",") && gsub(/^,|,$/,"") && $3~/^,600/' file
    201480         ,6001400030046472   ,6001400030046771   ,2012         ,6100202520       ,AAA2777953
    202853         ,6001700000180323   ,6001700000180722   ,2012         ,6100202520       ,AAA2777953
    
    $ awk -F, 'gsub(/\|/,",") && gsub(/^,|,$/,"") && $3~/^600/' file
    201480         ,6001400030046472   ,6001400030046771   ,2012         ,6100202520       ,AAA2777953
    202853         ,6001700000180323   ,6001700000180722   ,2012         ,6100202520       ,AAA2777953
    

    【讨论】:

    • 不客气。如果您还有其他问题,请多考虑您创建的示例。在这种情况下,您说您只想要以“2”开头的行,但您的输入仅包含以“2”开头的行,因此无需测试潜在解决方案是否满足该要求。我的第一次尝试从您发布的示例输入中产生了您发布的预期输出,@fedorqui 注意到它实际上并没有工作,因为我忽略了您的“仅以 2 开头的行”要求。
    • Ed Morton,当我尝试提取行 intems 如果 $3 以 600 以下命令不起作用时,请建议.. awk 'gsub(/\|/,",") && gsub( /^,|,$/,"") && $3~/^600/' Input.txt
    • @BBB $3 是什么意思?输入中的所有字段都不是以 600 或任何其他数字开头,在前 2 个 gsub() 之后,它们都以 , 开头。想想 awk 使用什么作为默认字段分隔符,您就会明白为什么。如果你想让它使用不同的东西,那么你需要告诉它。
    • @edmorton,希望从上面的输入中选择以下订单项目, 201480,6001400030046472,6001400030046771,2012,6100202520
    • 我无法准确说出您评论中的内容。我之前在答案末尾发布的脚本对您不起作用吗?
    【解决方案2】:

    你可以说:

    $ awk -F"|" -v OFS="," '$2~/^2/ {NF--; $0=$0; print}' file
    ,200965         ,18604165309338     ,18604165309387     ,2012         ,6100202749       ,AAA2778202       
    ,201163         ,10740000822407     ,10740000822606     ,2012         ,6100202749       ,AAA2778202       
    ,201232         ,18604177741067     ,18604177741366     ,2012         ,6100202749       ,AAA2778202       
    ,201295         ,18604221522337     ,18604221523836     ,2012         ,6100202749       ,AAA2778202       
    ,201480         ,18604113309952     ,18604113310131     ,2012         ,6100202749       ,AAA2778202       
    ,201781         ,18604199150436     ,18604199150835     ,2012         ,6100202749       ,AAA2778202       
    ,201480         ,6001400030046472   ,6001400030046771   ,2012         ,6100202520       ,AAA2777953       
    ,202853         ,6001700000180323   ,6001700000180722   ,2012         ,6100202520       ,AAA2777953    
    

    【讨论】:

    • 您应该提到NF--; $0=$0 仅适用于某些awks。
    【解决方案3】:

    这可能对你有帮助

    $ cat file
    ---------------------------
    |Data statistics|Number of|
    |-------------------------|
    |Records passed |  750,517|
    ---------------------------
    Transaction Data for Serial Numbers
    
    No of Records :                                                      750517
    
    -----------------------------------------------------------------------------------------------------------
    |Material Number|Serial Number From |Serial Number To   |Document Year|Delivery Document|Material Document|
    |----------------------------------------------------------------------------------------------------------
    |200965         |18604165309338     |18604165309387     |2012         |6100202749       |AAA2778202       |
    |201163         |10740000822407     |10740000822606     |2012         |6100202749       |AAA2778202       |
    |201232         |18604177741067     |18604177741366     |2012         |6100202749       |AAA2778202       |
    |201295         |18604221522337     |18604221523836     |2012         |6100202749       |AAA2778202       |
    |201480         |18604113309952     |18604113310131     |2012         |6100202749       |AAA2778202       |
    |201781         |18604199150436     |18604199150835     |2012         |6100202749       |AAA2778202       |
    |201480         |6001400030046472   |6001400030046771   |2012         |6100202520       |AAA2777953       |
    |202853         |6001700000180323   |6001700000180722   |2012         |6100202520       |AAA2777953       |
    -----------------------------------------------------------------------------------------------------------
    

    输出

    $ awk 's=$1~/^\|2/{gsub(/^\||\|$/,""); gsub(/\|/,",")}s' file
    200965         ,18604165309338     ,18604165309387     ,2012         ,6100202749       ,AAA2778202       
    201163         ,10740000822407     ,10740000822606     ,2012         ,6100202749       ,AAA2778202       
    201232         ,18604177741067     ,18604177741366     ,2012         ,6100202749       ,AAA2778202       
    201295         ,18604221522337     ,18604221523836     ,2012         ,6100202749       ,AAA2778202       
    201480         ,18604113309952     ,18604113310131     ,2012         ,6100202749       ,AAA2778202       
    201781         ,18604199150436     ,18604199150835     ,2012         ,6100202749       ,AAA2778202       
    201480         ,6001400030046472   ,6001400030046771   ,2012         ,6100202520       ,AAA2777953       
    202853         ,6001700000180323   ,6001700000180722   ,2012         ,6100202520       ,AAA2777953      
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多