精华内容
下载资源
问答
  • 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左右递增的顺序排序,每一列都按照从上下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路:...

    题目描述

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    思路:在如下矩阵中找7,从右上角的9开始找,因为9>7,剔除9这一列,分析剩下3列;因为8>7,剔除8这一列;因为2<7,剔除2这一行向下寻找;因为4<7,剔除4这一行向下寻找.

    1 2 8 9

    2 4 9 12

    4 7 10 13

    6 8 11 15

    class Solution{
    public:
       bool Find(int target, vector<vector<int> > array) {
        int t1=array[0].size(),t2=array.size();
        // printf("%d %d",t1,t2);
        int flag=0;
        while(t1>=1&&flag<t2)
        {
            if(array[flag][t1-1]>target)
            {
                t1--;
            }
            else if(array[flag][t1-1]<target)
            {
                flag++;
            }
            else
                return true;
        }
        return false;
    }
    };

     

    题目描述

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
     
    TreeNode* Create(vector<int> pre,vector<int> vin,int preL,int preR,int inL,int inR)
    {
        if(preL>preR)    //递归必不可少的跳出条件
            return NULL;
        TreeNode *root=new TreeNode(pre[preL]);
        int k;
        for(int i=inL;i<=inR;i++)
        {
            if(vin[i]==root->val)
            {
                k=i;
                break;  //不要漏掉!!!
            }
        }
        int leftNum=k-inL;  //别写错!!
        root->left=Create(pre,vin,preL+1,preL+leftNum,inL,k-1);
        root->right=Create(pre,vin,preL+leftNum+1,preR,k+1,inR);
        return root;
    }
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        if(pre.size()==0||vin.size()==0)
            return NULL;
        TreeNode *root=Create(pre,vin,0,pre.size()-1,0,vin.size()-1);
        return root;
    }

    };

    代码的鲁棒性:程序能够判断输入是否符合规范要求,并对不合要求的输入予以合理的处理。

    【链表】:求链表的中间节点:定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步,当走的快的指针走到链表的末尾时,走得慢的指针正好在链表的中间。

    判断一个单向链表是否形成了环形结构:定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步,当走得快的指针追上了走得慢的指针,那么链表就是环形链表。

     

    题目描述

    输入一个链表,反转链表后,输出新链表的表头。

     

    题目描述

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
                val(x), next(NULL) {
        }
    };*/
    class Solution {
    public:
     ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        if(pHead1==NULL)
            return pHead2;
        if(pHead2==NULL)
            return pHead1;
        ListNode *pHead=NULL;
        if(pHead1->val<=pHead2->val)
        {
            pHead=pHead1;
            pHead->next=Merge(pHead1->next,pHead2);
        }
        else if(pHead2->val<pHead1->val)
        {
            pHead=pHead2;
            pHead->next=Merge(pHead1,pHead2->next);
        }
        return pHead;
    }
    };

     

    题目描述

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

    输出描述:

    对应每个测试案例,输出两个数,小的先输出。

    因为数组是递增的,定义两个指针,第一个指向数组的第一个位置,第二个指向数组的最后一个位置。

    class Solution {
    public:
       vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        int len=array.size();
        int s1=0,s2=len-1;
        vector<int>v;
        while(s1<s2)
        {
            if(array[s1]+array[s2]==sum)
            {
                v.push_back(array[s1]);
                v.push_back(array[s2]);
                break;
            }
            else if(array[s1]+array[s2]>sum)
            {
                s2--;
            }
            else if(array[s1]+array[s2]<sum)
            {
                s1++;
            }
        }
        return v;
    }
    };

     

    题目描述

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

    class Solution {
    public:
    string LeftRotateString(string str, int n) {
        string s="";
        if(n==0)
            return str;
        if(str.length()==0)
            return s;
        reverse(str.begin(),str.begin()+n); //先翻转前一部分
        reverse(str.begin()+n,str.begin()+str.length());  //翻转后一部分
        reverse(str.begin(),str.begin()+str.length());  //翻转整个字符串
        return str;
    }
    };

     

    题目描述

    从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };
    */
    class Solution {
    public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int>>v;
        if(pRoot==NULL)    //特殊情况的处理
            return v;
        queue<TreeNode*>q;
        q.push(pRoot);
        while (!q.empty()) {
            vector<int>c;
            int x=q.size();
            int i=0;
            while(i++<x)       //层数的处理
            {
                TreeNode *tmp=q.front();
                c.push_back(tmp->val);
                q.pop();
                if(tmp->left)
                {
                    q.push(tmp->left);
                }
                if(tmp->right)
                {
                    q.push(tmp->right);
                }
            }
            v.push_back(c);
        }
        return v;
    }
    };

    展开全文
  • 单元格内容提取。 使用在网上下载好的宏文件,将之加载excel文件中。在对应单元格中填写相应的公式,...将一行数据转换成多行,将几列数据打印转换成多几列数据打印(如图)。 ‘ 合并多个工作表,工作薄。 ...

    单元格内容提取。

    使用在网上下载好的宏文件,将之加载到excel文件中。在对应单元格中填写相应的公式,提取单元格内容。
    1:加载宏的方式。

    excel使用宏加载

    2:使用宏提取表格中的文字。
    p_pinyin:将汉字转换成拼音存储到单元格中。
    p_num:提取表格中的数字。
    p_phone:将单元格中的电话号提取出来。


    将一行数据转换成多行,将几列数据打印转换成多几列数据打印(如图)。


    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    视频:

    单行或列转换成多行或列

    合并多个工作表,工作薄。

    excel多个工作薄合并,多个表格合并

    展开全文
  • pandas合并

    2020-12-02 19:37:36
    append多用于将一行数据添加进行已有数据的一行中, 而assign则可以将多行数据同时添加。 df_append = df.loc[:3,['Gender', 'Height']].copy() #数字代表复制第几行,而中括号中的内容表示复制哪个序列 print(df_...


    一、append与assign

    append多用于将一行数据添加进行已有数据的一行中,
    而assign则可以将多行数据同时添加。

    df_append = df.loc[:3,['Gender', 'Height']].copy()  #数字代表复制到第几行,而中括号中的内容表示复制哪个序列
    print(df_append)
    
    s = pd.Series({'Gender':'F','Height':188},name='new_row')    #创建一个新的行。
    print(df_append.append(s))
    
    '''
            Gender  Height
    0            M     173
    1            F     192
    2            M     186
    3            F     167
    new_row      F     188
    '''
    
    df_temp = pd.DataFrame({'Gender':['F','M'],'Height':[188,176]},index=['new_1','new_2'])    #同时创建多个行
    print(df_append.append(df_temp))
    
    '''
          Gender  Height
    0          M     173
    1          F     192
    2          M     186
    3          F     167
    new_1      F     188
    new_2      M     176
    '''
    

    二、combine与update

    combine函数可以用于合并两组数据并显示两组数据中符合要求的值。
    而update函数则可以将新数据升级进旧数据中。

    df1 = pd.DataFrame({'A':[1, 20], 'B':[3, 4]})
    df2 = pd.DataFrame({'A':[8, 7], 'B':[6, 5]})
    print(df1.combine(df2,lambda x,y : x if x.mean()>y.mean() else y))      #求平均值,大的输出
    
    '''
        A  B
    0   1  6
    1  20  5
    '''
    
    df2 = pd.DataFrame({'B':[8, 7], 'C':[6, 5]}, index=[1,2])
    print(df1.combine(df2, lambda x,y : x if x.mean()>y.mean() else y))     #为什么这里的输出值不是整形呢??????
    
    '''
        A    B    C
    0 NaN  NaN  NaN
    1 NaN  8.0  6.0
    2 NaN  7.0  5.0
    '''
    

    为什么这的值突然就有小数了呢?

    print(df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y,overwrite=False))        #overwrite默认值为True
    
    print(df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y,fill_value=-1))
    
    '''
          A    B    C
    0   1.0  NaN  NaN
    1  20.0  8.0  6.0
    2   NaN  7.0  5.0
          A    B    C
    0   1.0 -1.0 -1.0
    1  20.0  8.0  6.0
    2  -1.0  7.0  5.0
    '''
    

    从这个例子中可以得出,overwrite=False可以将所有值显示出来,即不符合条件的值不会被覆盖
    fill_value=-1则可以帮我们将缺失值填充。


    df1 = pd.DataFrame({'A': [1, 2, 3],
                        'B': [400, 500, 600]})
    df2 = pd.DataFrame({'B': [4, 5, 6],
                        'C': [7, 8, 9]})
    df1.update(df2)
    print(df1)
    
    df1 = pd.DataFrame({'A': [1, 2, 3],
                        'B': [400, 500, 600]})
    df2 = pd.DataFrame({'B': [4, np.nan, 6]})
    df1.update(df2)
    print(df1)
    '''
       A  B
    0  1  4
    1  2  5
    2  3  6
       A      B
    0  1    4.0
    1  2  500.0
    2  3    6.0
    '''     
    

    注意这里设置缺失值是用’np.nan’, 同时,缺失值是不会覆盖前值的。♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥
    在这里插入图片描述


    三、concat方法

    df1 = pd.DataFrame({'A': ['A0', 'A1'],
                        'B': ['B0', 'B1']},
                        index = [0,1])
    df2 = pd.DataFrame({'A': ['A2', 'A3'],
                        'B': ['B2', 'B3']},
                        index = [2,3])
    df3 = pd.DataFrame({'A': ['A1', 'A3'],
                        'D': ['D1', 'D3'],
                        'E': ['E1', 'E3']},
                        index = [1,3])
    
    
    print(pd.concat([df1, df2], axis=1))
    
    print(pd.concat([df1,df3],join='inner'))        # 交集
    
    print(pd.concat([df3,df1],join='outer',sort=True))      #'outer'表示并集,sort设置列排序
    
    '''
         A    B    A    B
    0   A0   B0  NaN  NaN
    1   A1   B1  NaN  NaN
    2  NaN  NaN   A2   B2
    3  NaN  NaN   A3   B3
        A
    0  A0
    1  A1
    1  A1
    3  A3
        A    B    D    E
    1  A1  NaN   D1   E1
    3  A3  NaN   D3   E3
    0  A0   B0  NaN  NaN
    1  A1   B1  NaN  NaN
    '''
    

    s = pd.Series(['X0', 'X1'], name='X')
    print(pd.concat([df1,s],axis=1))
    
    print(pd.concat([df1,df2], keys=['x', 'y']))
    print(pd.concat([df1,df2], keys=['x', 'y']).index)     #  .index  的作用是表示出索引值的对应项
    
    '''
        A   B   X
    0  A0  B0  X0
    1  A1  B1  X1
          A   B
    x 0  A0  B0
      1  A1  B1
    y 2  A2  B2
      3  A3  B3
    MultiIndex([('x', 0),
                ('x', 1),
                ('y', 2),
                ('y', 3)],
               )
    '''
    

    四、merge与join

    • merge函数的作用是将两个pandas对象横向合并,遇到重复的索引项时会使用笛卡尔积,默认inner连接,可选left、outer、right连接
    • 所谓左连接,就是指以第一个表索引为基准,右边的表中如果不再左边的则不加入,如果在左边的就以笛卡尔积的方式加入
    • merge/join与concat的不同之处在于on参数,可以指定某一个对象为key来进行连接
    left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                         'key2': ['K0', 'K1', 'K0', 'K1'],
                          'A': ['A0', 'A1', 'A2', 'A3'],
                          'B': ['B0', 'B1', 'B2', 'B3']})
    right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                          'key2': ['K0', 'K0', 'K0', 'K0'],
                          'C': ['C0', 'C1', 'C2', 'C3'],
                          'D': ['D0', 'D1', 'D2', 'D3']})
    right2 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                          'key2': ['K0', 'K0', 'K0', 'K0'],
                          'C': ['C0', 'C1', 'C2', 'C3']})
    
    print(pd.merge(left, right, on='key1'))     #以key1为索引,从right中key1对应的索引,将那一列打印在一行中。
    
    '''
      key1 key2_x   A   B key2_y   C   D
    0   K0     K0  A0  B0     K0  C0  D0
    1   K0     K1  A1  B1     K0  C0  D0
    2   K1     K0  A2  B2     K0  C1  D1
    3   K1     K0  A2  B2     K0  C2  D2
    4   K2     K1  A3  B3     K0  C3  D3
    '''
    

    看清楚,这是从left中地key1中得到门牌号(索引值),拿着这个门牌号到right中找到对应的门牌号,随后开门,进屋,将屋内的物品一一列出来,如果找不到对应的门牌号,则拿不了里面的物品(其他值)。


    问题与习题

    1. 问题

    【问题一】 请思考什么是append/assign/combine/update/concat/merge/join各自最适合使用的场景,并举出相应的例子。

    append:增加行,必须要指定列名和索引名
    assign:增加列,列名由参数决定
    combine:两个表进行填充时
    update:用df2中的值替换df中的值,最后结果直接在df1中更改,形状不变

    concat:两个表进行连接,concat方法可以在两个维度上拼接,默认纵向凭借(axis=0),拼接方式默认外连接
    所谓外连接,就是取拼接方向的并集,而’inner’时取拼接方向(若使用默认的纵向拼接,则为列的交集)的交集

    merge:merge函数的作用是将两个pandas对象横向合并,遇到重复的索引项时会使用笛卡尔积,默认inner连接,可选left、outer、right连接
    所谓左连接,就是指以第一个表索引为基准,右边的表中如果不再左边的则不加入,如果在左边的就以笛卡尔积的方式加入

    join:join函数作用是将多个pandas对象横向拼接,遇到重复的索引项时会使用笛卡尔积,默认左连接,可选inner、outer、right连接


    【问题二】 merge_ordered和merge_asof的作用是什么?和merge是什么关系?
    merge_ordered函数允许组合时间序列和其他有序数据。 特别是它有一个可选的fill_method关键字来填充/插入缺失的数据。
    merge_asof除了我们匹配最近的键而不是相等的键之外,其他的都类似于有序的left-join 。 对于左侧DataFrame中的每一行,我们选择右侧DataFrame中on键对应的值小于left的键对应的值的最后一行。 两个DataFrame必须按键排序。


    【问题三】 请构造一个多级索引与多级索引合并的例子,尝试使用不同的合并函数。

    df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
    df2 = pd.DataFrame({'A': [8, 7], 'B': [6, 5]})
    df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y)
    
    '''
        A  B
    0   1  6
    1  20  5
    '''
    

    【问题四】 上文提到了连接的笛卡尔积,那么当连接方式变化时(inner/outer/left/right),这种笛卡尔积规则会相应变化吗?请构造相应例子。
    会变化。

    left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                         'key2': ['K0', 'K1', 'K0', 'K1'],
                          'A': ['A0', 'A1', 'A2', 'A3'],
                          'B': ['B0', 'B1', 'B2', 'B3']}) 
    right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                          'key2': ['K0', 'K0', 'K0', 'K0'],
                          'C': ['C0', 'C1', 'C2', 'C3'],
                          'D': ['D0', 'D1', 'D2', 'D3']})
    right2 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                          'key2': ['K0', 'K0', 'K0', 'K0'],
                          'C': ['C0', 'C1', 'C2', 'C3']})
    
    print(pd.merge(left, right, how='outer', on=['key1','key2']))
    '''
      key1 key2    A    B    C    D
    0   K0   K0   A0   B0   C0   D0
    1   K0   K1   A1   B1  NaN  NaN
    2   K1   K0   A2   B2   C1   D1
    3   K1   K0   A2   B2   C2   D2
    4   K2   K1   A3   B3  NaN  NaN
    5   K2   K0  NaN  NaN   C3   D3
    '''
    
    print(pd.merge(left, right, how='left', on=['key1', 'key2']))
    
    '''
      key1 key2   A   B    C    D
    0   K0   K0  A0  B0   C0   D0
    1   K0   K1  A1  B1  NaN  NaN
    2   K1   K0  A2  B2   C1   D1
    3   K1   K0  A2  B2   C2   D2
    4   K2   K1  A3  B3  NaN  NaN
    '''
    
    pd.merge(left, right, how='right', on=['key1', 'key2'])
    
    '''
      key1 key2    A    B   C   D
    0   K0   K0   A0   B0  C0  D0
    1   K1   K0   A2   B2  C1  D1
    2   K1   K0   A2   B2  C2  D2
    3   K2   K0  NaN  NaN  C3  D3
    '''
    

    2.习题

    【练习一】有2张公司的员工信息表,每个公司共有16名员工,共有五个公司,请解决如下问题:

    df1 = pd.read_csv('Employee1.csv')
    df2 = pd.read_csv('Employee2.csv')
    

    (a) 每个公司有多少员工满足如下条件:既出现第一张表,又出现在第二张表。

    n = set(df1['Name'].values.tolist())&set(df2['Name'].values.tolist())
    print(n)
    '''
    {'d5', 'a3', 'e10', 'b1', 'c13', 'e8', 'a6', 'a1', 'b15', 'd10', 'e11', 'b7', 'c12', 'c3', 'b3', 'c10'}
    '''
    

    (b) 将所有不符合(a)中条件的行筛选出来,合并为一张新表,列名与原表一致。

    df3 = pd.concat([df1,df2])
    b = df3[~df3['Name'].isin(n)]
    print(b.head())
    
    '''
      Company Name  Age  Height  Weight  Salary
    2       A   a4   43     158    62.5   21755
    4       A   a7   49     171    94.6    6177
    5       A   a8   51     168    89.5    3246
    6       A   a9   36     186    62.8    3569
    7       A  a13   58     190    75.9   21854
    '''
    


    展开全文
  • 笔记目录 ... sed在某一行最后添加一个数字 删除某行最后一行 打印1100行含某个字符串的行 awk 中使用外部shell变量 awk 合并一个文件 把一个文件多行连接成一行 awk中gsub函数的使用 ...

    笔记目录

    1. 打印某行到某行之间的内容
    2. sed转换大小写
    3. sed在某一行最后添加一个数字
    4. 删除某行到最后一行
    5. 打印1到100行含某个字符串的行
    6. awk 中使用外部shell变量
    7. awk 合并一个文件 
    8. 把一个文件多行连接成一行
    9. awk中gsub函数的使用
    10. awk 截取指定多个域为一行
    11. 过滤两个或多个关键词 
    12. 用awk生成以下结构文件
    13. awk用print打印单引号
    14. 合并两个文件
    15. awk的BEGIN和END
    16. awk的参考教程

     

    一.打印某行到某行之间的内容

    • #sed -n '/\[abcfd\]/,/\[rty\]/p' test 截取一段内容

    例如:有个文件test的内容如下:
    ert
    fff
    **
    [abcfd]
    123
    324
    444
    [rty]
    **
    fgfgf
    #sed -n '/\[abcfd\]/,/\[rty\]/p' test选定开头段和结尾段后,截取的内容如下
    [abcfd]
    123
    324
    444
    [rty]

     

    二.sed转换大小写

    • sed中,使用\u表示大写,\l表示小写


    1. 把每个单词的第一个小写字母变大写:
    #sed 's/\b[a-z]/\u&/g' filename

    2. 把所有小写变大写:
    #sed 's/[a-z]/\u&/g' filename

    3. 大写变小写:
    #sed 's/[A-Z]/\l&/g' filename

     

    三.sed在某一行最后添加一个数字

    • #sed 's/\(^a.*\)/\1 12/' test

    #cat  test
    askdj
    aslkd aslkdjf3e
    skdjfsdfj
    sdkfjk
    fsdkfjksdjfkjsdf
    12sdfesdf
    aslkdjfkasdjf asdlfkjaskdfj

    • #sed 's/\(^a.*\)/\1 12/' test

    askdj 12
    aslkd aslkdjf3e  12
    skdjfsdfj
    sdkfjk
    fsdkfjksdjfkjsdf
    12sdfesdf
    aslkdjfkasdjf asdlfkjaskdfj  12

     

    四.删除某行到最后一行

    [root@test200 ~]# cat test
    a
    b
    c
    d
    e
    f
    [root@test200 ~]# sed '/c/{p;:a;N;$!ba;d}' test
    a
    b
    c

    • 定义一个标签a,匹配c,然后N把下一行加到模式空间里,匹配最后一行时,才退出标签循环,然后命令d,把这个模式空间里的内容全部清除。


    if 匹配"c"
    :a
    追加下一行
    if 不匹配"$"
    goto a
    最后退出循环,d命令删除。

     

    五.打印1到100行含某个字符串的行

    • 这个需求,其实就是sed指定行范围匹配,较少见。实现:

    #sed  -n '1,100{/abc/p}'  1.txt

     

    六.awk 中使用外部shell变量

    • 如:

    A=44echo "ABCD" | awk -v GET_A=$A ’{print GET_A}’
    说明:-v选项用于定义参数,这里表示将变量A的值赋予GET_A。

    • 有多少个变量需要赋值,就需要多少个-v选项。与之等价的:应用于脚本中:


    #! /bin/bash
    sort -n filename |awk -F ':' '{print $1}'|uniq >id.txt
    for id in `cat id.txt`; do
            echo "[$id]"

            awk -v id2=$id -F ':' '$1==id2 {print $2}' filename  // 另外的方式为: awk -F ':' '$1=="'id'" {print $2}' filename  

    done
    附件:
    cat filename
    1111111:13443253456
    2222222:13211222122
    1111111:13643543544
    3333333:12341243123
    2222222:12123123123
    运行脚本后结果为:
    [1111111]
    13443253456
    13643543544
    [2222222]
    13211222122
    12123123123
    [3333333]
    12341243123

     

    七.awk 合并一个文件 

    我有这样的需求,需要把两个文件中,第一列相同的行合并到同一行中。举个例子,有两个文件,内容如下

    #cat 1.txt

    1 aa
    2 bb
    3 ee
    4 ss

    #cat 2.txt

    1 ab
    2 cd
    3 ad
    4 bd
    5 de

     

    合并后的结果为:

    1 ab aa
    2 cd bb
    3 ad ee
    4 bd ss
    5 de

     

    • 实现的命令为:

    awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}'  1.txt  2.txt

     

    解释:NR表示读取的行数, FNR表示读取的当前行数,大家可以运行这个命令 awk '{print NR,FNR}' 1.txt  2.txt,比较NR和FNR

     

    所以其实NR==FNR 就表示读取1.txt的时候。 同理NR>FNR表示读取2.txt的时候

     

    数组a其实就相当于一个map

     

    八.把一个文件多行连接成一行

    #a=`cat file`;echo $a 

    awk '{printf("%s ",$0)}' file   // %s 后记得要有一空格,否则出来就是完全连在一起的,中间连空格都没有
    cat file |xargs

     

    九.awk中gsub函数的使用

    • #awk 'gsub(/www/,"abc")' /etc/passwd  // passwd文件中把所有www替换为abc
    • #awk -F ':' 'gsub(/www/,"abc",$1) {print $0}' /etc/passwd  // 替换$1中的www为abc


     

    十.awk 截取指定多个域为一行

    • 用awk指定分隔符把文本分为若干段。如何把相同段的内容弄到一行?

    以/etc/passwd为例,该文件以":"作为分隔符,分为了7段。

    for i in `seq 1 7`

    do

        awk -F ':' -v a=$i '{printf $a " "}' /etc/passwd

        echo 

    done

     

    十一.过滤两个或多个关键词 

    • #grep -E '123|abc' filename  // 找出文件(filename)中包含123或者包含abc的行
    • #egrep '123|abc' filename    //用egrep同样可以实现
    • #awk '/123|abc/'  filename // awk 的实现方式
       

     

    十二.用awk生成以下结构文件

    用awk编写生成以下结构文件的程序。( 最后列使用现在的时间,时间格式为YYYYMMDDHHMISS)  各列的值应如下所示,每增加一行便加1,共500万行。

    #awk 'BEGIN{for(i=1;i<=10;i++)printf("%d,%d,%010d,%010d,%010d,%010d,%010d,%010d,%d\n",i,i,i,i,i,i,i,i,strftime("%Y%m%d%H%M"))}'

    1,1,0000000001,0000000001,0000000001,0000000001,0000000001,0000000001,2005100110101
    2,2,0000000002,0000000002,0000000002,0000000002,0000000002,0000000002,2005100110101

     

    十三.awk用print打印单引号

    比较绕,不用死记硬背,以后用的时候,稍微多试几次就出来了。 

    • #awk 'BEGIN{print "a'"'"'s"}'  //不用脱义,就多写几个单引号、双引号
    • #awk 'BEGIN{print "a'\''s"}'  //用脱义,脱义的是单引号
    • #awk 'BEGIN{print "a\"s"}'  //用脱义,脱义的是双引号

     

    十四.合并两个文件

    paste  filename1  filename2 

    这样就可以实现了。举个例子。
    cat  a.txt
    1 2 3 
    4 5 6 
    a b c

    cat b.txt
    3 2 1 
    6 5 4 
    c b a 

    则  paste  a.txt  b.txt  结果为
    1 2 3   3 2 1
    4 5 6   6 5 4
    a b c   c b a

    如果,你想在两个文件连接处用一个指定的字符连接,还可以用-d来指定
    paste -d '+'  a.txt b.txt
    结果为
    1 2 3+3 2 1
    4 5 6+6 5 4
    a b c+c b a

     

    十五.awk的BEGIN和END

    #cat password

    root:x:0:0:root:/root:/bin/bash

    bin:x:1:1:bin:/bin:/sbin/nologin

    operator:x:11:0:operator:/root:/sbin/nologin

    haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

    root:x:0:0:root:/root:/bin/bash

    mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

    root:x:0:0:root:/root:/bin/bash

    #awk '/root/{count++;}{print "root was found "count" times"}' /mnt/passwd

    root was found 1 times

    root was found 1 times

    root was found 2 times

    root was found 2 times

    root was found 3 times

    root was found 3 times

    root was found 4 times

    # awk '/root/{count++;}END{print "root was found "count" times"}' /mnt/passwd

    root was found 4 times

    ===========================

    BEGIN模块后紧跟着动作块,这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS,RS和FS等,以及打印标题。如:$ awk‘BEGIN{FS=”:”; OFS=”\t”; ORS=”\n\n”}{print $1,$2,$3} test。上式表示,在处理输入文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个换行符。$ awk ‘BEGIN{print “TITLE TEST”}只打印标题.

    END不匹配任何的输入文件,但是执行动作块中的所有动作,它在整个输入文件处理完成后被执行。如$ awk ‘END{print “The number of records is” NR}’ test,上式将打印所有被处理的记录数。

    如何把一行竖排的数据转换成横排?

    awk ‘{printf(“%s,”,$1)}’ filename

     

    awk ‘BEGIN {FS=”:”;OFS=”:”} gsub(/root/,”hwl”,$1) {print $0}’ passwd 作用于域t
    awk ‘BEGIN {FS=”:”;OFS=”:”} gsub(/root/,”hwl”) {print $0}’ passwd 作用于全部域
    awk ‘BEGIN {FS=”:”;OFS=”:”} sub(/root/,”hwl”,$6) {print $0}’ passwd 将t中第一次出现的r替换为s

    =================================

    在Unix awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。

    任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

    例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):

    cat sx

    一:50件:200.00

    二:60件:300.00

    三:70件:400.00

    $awk
    'BEGIN { FS=":";print "统计销售金额";total=0}
    {print $3;total=total+$3;}
    END {printf "销售金额总计:%.2f",total}' sx

    统计销售金额

    200.00

    300.00

    400.00

    销售金额总计:900.00

    (注:>是shell提供的第二提示符,如要在shell程序Unix awk语句和Unix awk语言中换行,则需在行尾加反斜杠)

    在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描之前显示出输出行头。而END则在扫描完成后打印出总合计。

    # awk 'BEGIN { FS=":";print "统计销售金额";total=0} {print $3;total=total+$3;}{printf "销售金额总计:%.2f",total}' sx

    统计销售金额

    200.00

    销售金额总计:200.00300.00 //200+0 300

    销售金额总计:500.00400.00 //200+300 400

    销售金额总计:900.00 //500+400

    ================================

    包含BEGIN模式和END模式的脚本awkscript:

    #!/usr/bin/awk -f
    -f参数告诉awk将该文件作为awk的程序文件,然后即可运行该程序。
    # awk script using pipes -- awkscript
    #1-  第一部分BEGIN会先执行,在输入文件之前执行
    BEGIN{
    printf " %-22s%s ", "NAME", "DISTRICT"
    print "--------------------------------------"
    }
    #-1
    #2- 第二部分 awk脚本正文,要对来自输入文件datafile的每一行都要执行一遍
    /west/{count++}
    {printf "%s %s %-15s ", $3, $4, $1| "sort +1" }
    #-2
    #3- 第三部分 输入文件关闭后awk退出之前执行
    END{
    close "sort +1"
    printf "The number of sales persons in the western "
    printf "region is " count "." 
    }

    =================

    awk  'BEGIN { OFS="%"}{print $1,$2}' file 通过设置输出分隔符(OFS="%")修改输出格式。

     

    十六.awk的参考教程

    1.awk用法,(使用入门)

    awk 用法:awk ' pattern {action} '  

    变量名    含义 
    ARGC   命令行变元个数 
    ARGV   命令行变元数组 
    FILENAME   当前输入文件名 
    FNR   当前文件中的记录号 
    FS   输入域分隔符,默认为一个空格 
    RS   输入记录分隔符 
    NF   当前记录里域个数 
    NR   到目前为止记录数 
    OFS   输出域分隔符 
    ORS   输出记录分隔符 

    1、awk '/101/'    file      显示文件file中包含101的匹配行。 
       awk '/101/,/105/'  file 
       awk '$1 == 5'    file 
       awk '$1 == "CT"'    file    注意必须带双引号 
       awk '$1 * $2 >100 '   file  
       awk '$2 >5 && $2<=15'  file


    2、awk '{print NR,NF,$1,$NF,}' file     显示文件file的当前记录号、域数和每一行的第一个和最后一个域。 
       awk '/101/ {print $1,$2 + 10}' file       显示文件file的匹配行的第一、二个域加10。 
       awk '/101/ {print $1$2}'  file 
       awk '/101/ {print $1 $2}' file       显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。


    3、df | awk '$4>1000000 '         通过管道符获得输入,如:显示第4个域满足条件的行。


    4、awk -F "|" '{print $1}'   file         按照新的分隔符“|”进行操作。 
       awk  'BEGIN { FS="[: \t|]" } 
       {print $1,$2,$3}'       file         通过设置输入分隔符(FS="[: \t|]")修改输入分隔符。 

       Sep="|" 
       awk -F $Sep '{print $1}'  file   按照环境变量Sep的值做为分隔符。    
       awk -F '[ :\t|]' '{print $1}' file   按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。 
       awk -F '[][]'    '{print $1}' file   按照正则表达式的值做为分隔符,这里代表[、]


    5、awk -f awkfile    file         通过文件awkfile的内容依次进行控制。 
       cat awkfile 
    /101/{print "\047 Hello! \047"}    --遇到匹配行以后打印 ' Hello! '.  \047代表单引号。 
    {print $1,$2}                      --因为没有模式控制,打印每一行的前两个域。


    6、awk '$1 ~ /101/ {print $1}' file         显示文件中第一个域匹配101的行(记录)。


    7、awk   'BEGIN { OFS="%"} 
       {print $1,$2}'  file           通过设置输出分隔符(OFS="%")修改输出格式。


    8、awk   'BEGIN { max=100 ;print "max=" max}             BEGIN 表示在处理任意行之前进行的操作。 
       {max=($1 >max ?$1:max); print $1,"Now max is "max}' file           取得文件第一个域的最大值。 
       (表达式1?表达式2:表达式3 相当于: 
       if (表达式1) 
           表达式2 
       else 
           表达式3 
       awk '{print ($1>4 ? "high "$1: "low "$1)}' file 


    9、awk '$1 * $2 >100 {print $1}' file         显示文件中第一个域匹配101的行(记录)。


    10、awk '{$1 == 'Chi' {$3 = 'China'; print}' file        找到匹配行后先将第3个域替换后再显示该行(记录)。 
        awk '{$7 %= 3; print $7}'  file           将第7域被3除,并将余数赋给第7域再打印。


    11、awk '/tom/ {wage=$2+$3; printf wage}' file          找到匹配行后为变量wage赋值并打印该变量。


    12、awk '/tom/ {count++;}  
             END {print "tom was found "count" times"}' file            END表示在所有输入行处理完后进行处理。


    13、awk 'gsub(/\$/,"");gsub(/,/,""); cost+=$4; 
             END {print "The total is $" cost>"filename"}'    file             gsub函数用空串替换$和,再将结果输出到filename中。 
        1 2 3 $1,200.00 
        1 2 3 $2,300.00 
        1 2 3 $4,000.00 

        awk '{gsub(/\$/,"");gsub(/,/,""); 
        if ($4>1000&&$4<2000) c1+=$4; 
        else if ($4>2000&&$4<3000) c2+=$4; 
        else if ($4>3000&&$4<4000) c3+=$4; 
        else c4+=$4; } 
        END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file 
        通过if和else if完成条件语句 

        awk '{gsub(/\$/,"");gsub(/,/,""); 
        if ($4>3000&&$4<4000) exit; 
        else c4+=$4; } 
        END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file 
        通过exit在某条件时退出,但是仍执行END操作。 
        awk '{gsub(/\$/,"");gsub(/,/,""); 
        if ($4>3000) next; 
        else c4+=$4; } 
        END {printf  "c4=[%d]\n",c4}"' file 
        通过next在某条件时跳过该行,对下一行执行操作。 


    14、awk '{ print FILENAME,$0 }' file1 file2 file3>fileall              把file1、file2、file3的文件内容全部写到fileall中,格式为 
        打印文件并前置文件名。


    15、awk ' $1!=previous { close(previous); previous=$1 }    
        {print substr($0,index($0," ") +1)>$1}' fileall           把合并后的文件重新分拆为3个文件。并与原文件一致。


    16、awk 'BEGIN {"date"|getline d; print d}'         通过管道把date的执行结果送给getline,并赋给变量d,然后打印。 


    17、awk 'BEGIN {system("echo \"Input your name:\\c\""); getline d;print "\nYour name is",d,"\b!\n"}' 
        通过getline命令交互输入name,并显示出来。 
        awk 'BEGIN {FS=":"; while(getline< "/etc/passwd" >0) { if($1~"050[0-9]_") print $1}}' 
        打印/etc/passwd文件中用户名包含050x_的用户名。 

    18、awk '{ i=1;while(i<NF) {print NF,$i;i++}}' file 通过while语句实现循环。 
        awk '{ for(i=1;i<NF;i++) {print NF,$i}}'   file 通过for语句实现循环。     
        type file|awk -F "/" ' 
        { for(i=1;i<NF;i++) 
        { if(i==NF-1) { printf "%s",$i } 
        else { printf "%s/",$i } }}'               显示一个文件的全路径。 
        用for和if显示日期 
        awk  'BEGIN { 
    for(j=1;j<=12;j++) 
    { flag=0; 
      printf "\n%d月份\n",j; 
            for(i=1;i<=31;i++) 
            { 
            if (j==2&&i>28) flag=1; 
            if ((j==4||j==6||j==9||j==11)&&i>30) flag=1; 
            if (flag==0) {printf "%02d%02d ",j,i} 
            } 

    }'


    19、在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串 
    Flag=abcd 
    awk '{print '$Flag'}'   结果为abcd 
    awk '{print  "$Flag"}'   结果为$Flag

    ===============================

        $awk 'BEGIN{total=0}{total+=$4}END{print total}' a.txt   -----对a.txt文件的第四个域进行求和!

    • $ awk '/^(no|so)/' test      -----打印所有以模式no或so开头的行。

    • $ awk '/^[ns]/{print $1}' test       -----如果记录以n或s开头,就打印这个记录。

    • $ awk '$1 ~/[0-9][0-9]$/(print $1}' test         -----如果第一个域以两个数字结束就打印这个记录。

    • $ awk '$1 == 100 || $2 < 50' test      -----如果第一个或等于100或者第二个域小于50,则打印该行。

    • $ awk '$1 != 10' test    -----如果第一个域不等于10就打印该行。

    • $ awk '/test/{print $1 + 10}' test  -----如果记录包含正则表达式test,则第一个域加10并打印出来。

    • $ awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test   -----如果第一个域大于5则打印问号后面的表达式值,否则打印冒号后面的表达式值。

    • $ awk '/^root/,/^mysql/' test        ----打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记录,则继续打印直到下一个以正则表达式mysql开头的记录为止,或到文件末尾。

    十七.awk详细课程内容

    1. awk简介

    2. awk命令格式和选项

    2.1. awk的语法有两种形式

    2.2. 命令选项

    3. 模式和操作

    3.1. 模式

    3.2. 操作

    4. awk的环境变量

    5. awk运算符

    6. 记录和域

    6.1. 记录

    6.2. 域

    6.3. 域分隔符

    7. gawk专用正则表达式元字符

    8. POSIX字符集

    9. 匹配操作符(~)

    10. 比较表达式

    11. 范围模板

    12. 一个验证passwd文件有效性的例子

    13. 几个实例

    14. awk编程

    14.1. 变量

    14.2. BEGIN模块

    14.3. END模块

    14.4. 重定向和管道

    14.5. 条件语句

    14.6. 循环

    14.7. 数组

    14.8. awk的内建函数

    15. How-to

     

    1. awk简介

    awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。下面介绍的awk是以GUN的gawk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。

    2. awk命令格式和选项

    2.1. awk的语法有两种形式

    • awk [options] 'script' var=value file(s)

    • awk [options] -f scriptfile var=value file(s)

    2.2. 命令选项

    -F fs or --field-separator fs

    指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

    -v var=value or --asign var=value

    赋值一个用户定义变量。

    -f scripfile or --file scriptfile

    从脚本文件中读取awk命令。

    -mf nnn and -mr nnn

    对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

    -W compact or --compat, -W traditional or --traditional

    在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

    -W copyleft or --copyleft, -W copyright or --copyright

    打印简短的版权信息。

    -W help or --help, -W usage or --usage

    打印全部awk选项和每个选项的简短说明。

    -W lint or --lint

    打印不能向传统unix平台移植的结构的警告。

    -W lint-old or --lint-old

    打印关于不能向传统unix平台移植的结构的警告。

    -W posix

    打开兼容模式。但有以下限制,不识别:\x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。

    -W re-interval or --re-inerval

    允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

    -W source program-text or --source program-text

    使用program-text作为源代码,可与-f命令混用。

    -W version or --version

    打印bug报告信息的版本。

    3. 模式和操作

    awk脚本是由模式和操作组成的:

    pattern {action} 如$ awk '/root/' test,或$ awk '$3 < 100' test。

    两者是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。默认情况下,每一个输入行都是一条记录,但用户可通过RS变量指定不同的分隔符进行分隔。

    3.1. 模式

    模式可以是以下任意一个:

    • /正则表达式/:使用通配符的扩展集。

    • 关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。

    • 模式匹配表达式:用运算符~(匹配)和~!(不匹配)。

    • 模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。

    • BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

    • END:让用户在最后一条输入记录被读取之后发生的动作。

    3.2. 操作

    操作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份:

    • 变量或数组赋值

    • 输出命令

    • 内置函数

    • 控制流命令

    4. awk的环境变量

     

    Table 1. awk的环境变量

    变量 描述
    $n 当前记录的第n个字段,字段间由FS分隔。
    $0 完整的输入记录。
    ARGC 命令行参数的数目。
    ARGIND 命令行中当前文件的位置(从0开始算)。
    ARGV 包含命令行参数的数组。
    CONVFMT 数字转换格式(默认值为%.6g)
    ENVIRON 环境变量关联数组。
    ERRNO 最后一个系统错误的描述。
    FIELDWIDTHS 字段宽度列表(用空格键分隔)。
    FILENAME 当前文件名。
    FNR 同NR,但相对于当前文件。
    FS 字段分隔符(默认是任何空格)。
    IGNORECASE 如果为真,则进行忽略大小写的匹配。
    NF 当前记录中的字段数。
    NR 当前记录数。
    OFMT 数字的输出格式(默认值是%.6g)。
    OFS 输出字段分隔符(默认值是一个空格)。
    ORS 输出记录分隔符(默认值是一个换行符)。
    RLENGTH 由match函数所匹配的字符串的长度。
    RS 记录分隔符(默认是一个换行符)。
    RSTART 由match函数所匹配的字符串的第一个位置。
    SUBSEP 数组下标分隔符(默认值是\034)。

    5. awk运算符

     

    Table 2. 运算符

    运算符 描述
    = += -= *= /= %= ^= **= 赋值
    ?: C条件表达式
    || 逻辑或
    && 逻辑与
    ~      ~! 匹配正则表达式和不匹配正则表达式
    < <= > >= != == 关系运算符
    空格 连接
    + - 加,减
    * / & 乘,除与求余
    + - ! 一元加,减和逻辑非
    ^ *** 求幂
    ++ -- 增加或减少,作为前缀或后缀
    $ 字段引用
    in 数组成员

    6. 记录和域

    6.1. 记录

    awk把每一个以换行符结束的行称为一个记录。

    记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ORS和RS中。

    $0变量:它指的是整条记录。如$ awk '{print $0}' test将输出test文件中的所有记录。

    变量NR:一个计数器,每处理完一条记录,NR的值就增加1。如$ awk '{print NR,$0}' test将输出test文件中所有记录,并在记录前显示记录号。

    6.2. 域

    记录中每个单词称做“域”,默认情况下以空格或tab分隔。awk可跟踪域的个数,并在内建变量NF中保存该值。如$ awk '{print $1,$3}' test将打印test文件中第一和第三个以空格分开的列(域)。

    6.3. 域分隔符

    内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。

    可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F'[:\t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符。

    输出域的分隔符默认是一个空格,保存在OFS中。如$ awk -F: '{print $1,$5}' test,$1和$5间的逗号就是OFS的值。

    7. gawk专用正则表达式元字符

    以下几个是gawk专用的,不适合unix版本的awk。

    \Y

    匹配一个单词开头或者末尾的空字符串。

    \B

    匹配单词内的空字符串。

    \<

    匹配一个单词的开头的空字符串,锚定开始。

    \>

    匹配一个单词的末尾的空字符串,锚定末尾。

    \w

    匹配一个字母数字组成的单词。

    \W

    匹配一个非字母数字组成的单词。

    \‘

    匹配字符串开头的一个空字符串。

    \'

    匹配字符串末尾的一个空字符串。

    8. POSIX字符集

     

    9. 匹配操作符(~)

    用来在记录或者域内匹配正则表达式。如$ awk '$1 ~/^root/' test将显示test文件第一列中以root开头的行。

    10. 比较表达式

    conditional expression1 ? expression2: expression3,例如:$ awk '{max = {$1 > $3} ? $1: $3: print max}' test。如果第一个域大于第三个域,$1就赋值给max,否则$3就赋值给max。

    $ awk '$1 + $2 < 100' test。如果第一和第二个域相加大于100,则打印这些行。

    $ awk '$1 > 5 && $2 < 10' test,如果第一个域大于5,并且第二个域小于10,则打印这些行。

    11. 范围模板

    范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾。如$ awk '/root/,/mysql/' test将显示root第一次出现到mysql第一次出现之间的所有行。

    12. 一个验证passwd文件有效性的例子

    $ cat /etc/passwd | awk -F: '\
    NF != 7{\
    printf("line %d,does not have 7 fields:%s\n",NR,$0)}\
    $1 !~ /[A-Za-z0-9]/{printf("line %d,non alpha and numeric user id:%d: %s\n,NR,$0)}\$2 == "*" {printf("line %d, no password: %s\n",NR,$0)}'

    1

    cat把结果输出给awk,awk把域之间的分隔符设为冒号。

    2

    如果域的数量(NF)不等于7,就执行下面的程序。

    3

    printf打印字符串"line ?? does not have 7 fields",并显示该条记录。

    4

    如果第一个域没有包含任何字母和数字,printf打印“no alpha and numeric user id" ,并显示记录数和记录。

    5

    如果第二个域是一个星号,就打印字符串“no passwd”,紧跟着显示记录数和记录本身。

    13. 几个实例

    • $ awk '/^(no|so)/' test-----打印所有以模式no或so开头的行。

    • $ awk '/^[ns]/{print $1}' test-----如果记录以n或s开头,就打印这个记录。

    • $ awk '$1 ~/[0-9][0-9]$/(print $1}' test-----如果第一个域以两个数字结束就打印这个记录。

    • $ awk '$1 == 100 || $2 < 50' test-----如果第一个或等于100或者第二个域小于50,则打印该行。

    • $ awk '$1 != 10' test-----如果第一个域不等于10就打印该行。

    • $ awk '/test/{print $1 + 10}' test-----如果记录包含正则表达式test,则第一个域加10并打印出来。

    • $ awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test-----如果第一个域大于5则打印问号后面的表达式值,否则打印冒号后面的表达式值。

    • $ awk '/^root/,/^mysql/' test----打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记录,则继续打印直到下一个以正则表达式mysql开头的记录为止,或到文件末尾。

    14. awk编程

    14.1. 变量

    • 在awk中,变量不需要定义就可以直接使用,变量类型可以是数字或字符串。

    • 赋值格式:Variable = expression,如$ awk '$1 ~/test/{count = $2 + $3; print count}' test,上式的作用是,awk先扫描第一个域,一旦test匹配,就把第二个域的值加上第三个域的值,并把结果赋值给变量count,最后打印出来。

    • awk可以在命令行中给变量赋值,然后将这个变量传输给awk脚本。如$ awk -F: -f awkscript month=4 year=2004 test,上式的month和year都是自定义变量,分别被赋值为4和2004。在awk脚本中,这些变量使用起来就象是在脚本中建立的一样。注意,如果参数前面出现test,那么在BEGIN语句中的变量就不能被使用。

    • 域变量也可被赋值和修改,如$ awk '{$2 = 100 + $1; print }' test,上式表示,如果第二个域不存在,awk将计算表达式100加$1的值,并将其赋值给$2,如果第二个域存在,则用表达式的值覆盖$2原来的值。再例如:$ awk '$1 == "root"{$1 ="test";print}' test,如果第一个域的值是“root”,则把它赋值为“test”,注意,字符串一定要用双引号。

    • 内建变量的使用。变量列表在前面已列出,现在举个例子说明一下。$ awk -F: '{IGNORECASE=1; $1 == "MARY"{print NR,$1,$2,$NF}'test,把IGNORECASE设为1代表忽略大小写,打印第一个域是mary的记录数、第一个域、第二个域和最后一个域。

    14.2. BEGIN模块

    BEGIN模块后紧跟着动作块,这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS,RS和FS等,以及打印标题。如:$ awk 'BEGIN{FS=":"; OFS="\t"; ORS="\n\n"}{print $1,$2,$3} test。上式表示,在处理输入文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个换行符。$ awk 'BEGIN{print "TITLE TEST"}只打印标题。

    14.3. END模块

    END不匹配任何的输入文件,但是执行动作块中的所有动作,它在整个输入文件处理完成后被执行。如$ awk 'END{print "The number of records is" NR}' test,上式将打印所有被处理的记录数。

    14.4. 重定向和管道

    • awk可使用shell的重定向符进行重定向输出,如:$ awk '$1 = 100 {print $1 > "output_file" }' test。上式表示如果第一个域的值等于100,则把它输出到output_file中。也可以用>>来重定向输出,但不清空文件,只做追加操作。

    • 输出重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。如:

      $ awk 'BEGIN{ "date" | getline d; print d}' test。执行linux的date命令,并通过管道输出给getline,然后再把输出赋值给自定义变量d,并打印它。

      $ awk 'BEGIN{"date" | getline d; split(d,mon); print mon[2]}' test。执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给d,split函数把变量d转化成数组mon,然后打印数组mon的第二个元素。

      $ awk 'BEGIN{while( "ls" | getline) print}',命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。

      $ awk 'BEGIN{printf "What is your name?"; getline name < "/dev/tty" } $1 ~name {print "Found" name on line ", NR "."} END{print "See you," name "."} test。在屏幕上打印”What is your name?",并等待用户应答。当一行输入完毕后,getline函数从终端接收该行输入,并把它储存在自定义变量name中。如果第一个域匹配变量name的值,print函数就被执行,END块打印See you和name的值。

      $ awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'。awk将逐行读取文件/etc/passwd的内容,在到达文件末尾前,计数器lc一直增加,当到末尾时,打印lc的值。注意,如果文件不存在,getline返回-1,如果到达文件的末尾就返回0,如果读到一行,就返回1,所以命令 while (getline < "/etc/passwd")在文件不存在的情况下将陷入无限循环,因为返回-1表示逻辑真。

    • 可以在awk中打开一个管道,且同一时刻只能有一个管道存在。通过close()可关闭管道。如:$ awk '{print $1, $2 | "sort" }' test END {close("sort")}。awd把print语句的输出通过管道作为linux命令sort的输入,END块执行关闭管道操作。

    • system函数可以在awk中执行linux的命令。如:$ awk 'BEGIN{system("clear")'。

    • fflush函数用以刷新输出缓冲区,如果没有参数,就刷新标准输出的缓冲区,如果以空字符串为参数,如fflush(""),则刷新所有文件和管道的输出缓冲区。

    14.5. 条件语句

    awk中的条件语句是从C语言中借鉴过来的,可控制程序的流程。

    14.5.1. if 语句

    格式:
            {if (expression){
                       statement; statement; ...
                         }
            }

    $ awk '{if ($1 <$2) print $2 "too high"}' test。如果第一个域小于第二个域则打印。

    $ awk '{if ($1 < $2) {count++; print "ok"}}' test.如果第一个域小于第二个域,则count加一,并打印ok。

    14.5.2. if/else语句,用于双重判断

    格式:
            {if (expression){
                       statement; statement; ...
                           }
            else{
                       statement; statement; ...
                           }
            }

    $ awk '{if ($1 > 100) print $1 "bad" ; else print "ok"}' test。如果$1大于100则打印$1 bad,否则打印ok。

    $ awk '{if ($1 > 100){ count++; print $1} else {count--; print $2}' test。如果$1大于100,则count加一,并打印$1,否则count减一,并打印$1。

    14.5.3. if/else else if语句,用于多重判断。

    格式:
            {if (expression){
                        statement; statement; ...
                       }
            else if (expression){
                        statement; statement; ...
                       }
            else if (expression){
                        statement; statement; ...
                       }
            else {
                       statement; statement; ...
                 }
            }

    14.6. 循环

    • awk有三种循环: while循环;for循环;special for循环。

    • $ awk '{ i = 1; while ( i <= NF ) { print NF,$i; i++}}' test。变量的初始值为1,若i小于可等于NF(记录中域的个数),则执行打印语句,且i增加1。直到i的值大于NF.

    • $ awk '{for (i = 1; i<NF; i++) print NF,$i}' test。作用同上。

    • bread continue 语句。break用于在满足条件的情况下跳出循环;continue用于在满足条件的情况下忽略后面的语句,直接返回循环的顶端。如:

      {for ( x=3; x<=NF; x++) 
                  if ($x<0){print "Bottomed out!"; break}}
      {for ( x=3; x<=NF; x++)
                  if ($x==0){print "Get next item"; continue}}
    • next 语句从输入文件中读取一行,然后从头开始执行awk脚本。如:

      {if ($1 ~/test/){next}
          else {print}
      }
    • exit 语句用于结束awk程序,但不会略过END块。退出状态为0代表成功,非零值表示出错。

    14.7. 数组

    awk中的数组的下标可以是数字和字母,称为关联数组。

    14.7.1. 下标与关联数组

    • 用变量作为数组下标。如:$ awk {name[x++]=$2};END{for(i=0;i<NR;i++) print i,name[i]}' test。数组name中的下标是一个自定义变量x,awk初始化x的值为0,在每次使用后增加1。第二个域的值被赋给name数组的各个元素。在END模块中,for循环被用于循环整个数组,从下标为0的元素开始,打印那些存储在数组中的值。因为下标是关健字,所以它不一定从0开始,可以从任何值开始。

    • special for 循环用于读取关联数组中的元素。格式如下:

      {for (item in arrayname){
               print arrayname[item]
               }
      }
      $ awk '/^tom/{name[NR]=$1}; END{for(i in name){print name[i]}}' test。打印有值的数组元素。打印的顺序是随机的。
    • 用字符串作为下标。如:count["test"]

    • 用域值作为数组的下标。一种新的for循环方式,for (index_value in array) statement。如:$ awk '{count[$1]++} END{for(name in count) print name,count[name]}' test。该语句将打印$1中字符串出现的次数。它首先以第一个域作数组count的下标,第一个域变化,索引就变化。

    • delete 函数用于删除数组元素。如:$ awk '{line[x++]=$1} END{for(x in line) delete(line[x])}' test。分配给数组line的是第一个域的值,所有记录处理完成后,special for循环将删除每一个元素。

    14.8. awk的内建函数

    14.8.1. 字符串函数

    • sub 函数匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下:

      sub (regular expression, substitution string):
                  sub (regular expression, substitution string, target string)

      实例:

      $ awk '{ sub(/test/, "mytest"); print }' testfile
                  $ awk '{ sub(/test/, "mytest"); $1}; print }' testfile

      第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。如要在整个文件中进行匹配需要用到gsub

      第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候。

    • gsub 函数作用如sub,但它在整个文档中进行匹配。格式如下:

      gsub (regular expression, substitution string)
                  gsub (regular expression, substitution string, target string)

      实例:

      $ awk '{ gsub(/test/, "mytest"); print }' testfile
                  $ awk '{ gsub(/test/, "mytest" , $1) }; print }' testfile

      第一个例子在整个文档中匹配test,匹配的都被替换成mytest。

      第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。

    • index 函数返回子字符串第一次被匹配的位置,偏移量从位置1开始。格式如下:

      index(string, substring)

      实例:

      $ awk '{ print index("mytest", "test") }' testfile

      实例返回test在mytest的位置,结果应该是3。

    • length 函数返回记录的字符数。格式如下:

      length( string )
                  length

      实例:

      $ awk '{ print length( "test" ) }' 
                  $ awk '{ print length }' testfile

      第一个实例返回test字符串的长度。

      第二个实例返回testfile文件中第条记录的字符数。

    • substr 函数返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串。格式如下:

      substr( string, starting position )
                  substr( string, starting position, length of string )

      实例:

      $ awk '{ print substr( "hello world", 7,11 ) }'

      上例截取了world子字符串。

    • match 函数返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串。函数格式如下:

      match( string, regular expression )

      实例:

      $ awk '{start=match("this is a test",/[a-z]+$/); print start}'
                  $ awk '{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'

      第一个实例打印以连续小写字符结尾的开始位置,这里是11。

      第二个实例还打印RSTART和RLENGTH变量,这里是11(start),11(RSTART),4(RLENGTH)。

    • toupper 和tolower 函数可用于字符串大小间的转换,该功能只在gawk中有效。格式如下:

      toupper( string )
                  tolower( string )

      实例:

      $ awk '{ print toupper("test"), tolower("TEST") }'
    • split 函数可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割。格式如下:

      split( string, array, field separator )
                  split( string, array )

      实例:

      $ awk '{ split( "20:18:00", time, ":" ); print time[2] }'

      上例把时间按冒号分割到time数组内,并显示第二个数组元素18。

    14.8.2. 时间函数

    • systime函数返回从1970年1月1日开始到当前时间(不计闰年)的整秒数。格式如下:

      systime()

      实例:

      $ awk '{ now = systime(); print now }'
    • strftime函数使用C库中的strftime函数格式化时间。格式如下:

      systime( [format specification][,timestamp] )

      Table 3. 日期和时间格式说明符

      格式 描述
      %a 星期几的缩写(Sun)
      %A 星期几的完整写法(Sunday)
      %b 月名的缩写(Oct)
      %B 月名的完整写法(October)
      %c 本地日期和时间
      %d 十进制日期
      %D 日期 08/20/99
      %e 日期,如果只有一位会补上一个空格
      %H 用十进制表示24小时格式的小时
      %I 用十进制表示12小时格式的小时
      %j 从1月1日起一年中的第几天
      %m 十进制表示的月份
      %M 十进制表示的分钟
      %p 12小时表示法(AM/PM)
      %S 十进制表示的秒
      %U 十进制表示的一年中的第几个星期(星期天作为一个星期的开始)
      %w 十进制表示的星期几(星期天是0)
      %W 十进制表示的一年中的第几个星期(星期一作为一个星期的开始)
      %x 重新设置本地日期(08/20/99)
      %X 重新设置本地时间(12:00:00)
      %y 两位数字表示的年(99)
      %Y 当前月份
      %Z 时区(PDT)
      %% 百分号(%)

      实例:

      $ awk '{ now=strftime( "%D", systime() ); print now }'
                  $ awk '{ now=strftime("%m/%d/%y"); print now }'

    14.8.3. 内建数学函数

     

    Table 4. 

    函数名称 返回值
    atan2(x,y) y,x范围内的余切
    cos(x) 余弦函数
    exp(x) 求幂
    int(x) 取整
    log(x) 自然对数
    rand() 随机数
    sin(x) 正弦
    sqrt(x) 平方根
    srand(x) x是rand()函数的种子
    int(x) 取整,过程没有舍入
    rand() 产生一个大于等于0而小于1的随机数

    14.8.4. 自定义函数

    在awk中还可自定义函数,格式如下:

    function name ( parameter, parameter, parameter, ... ) {
                            statements
                            return expression                  # the return statement and expression are optional
            }

    15. How-to

    • 如何把一行竖排的数据转换成横排?

      awk '{printf("%s,",$1)}' filename

     

    awk中使用NR和FNR的一些例子

    http://blog.sina.com.cn/s/blog_5a3640220100b7c8.html

    http://www.linuxidc.com/Linux/2012-05/61174.htm

    一般在awk里面输入文件是多个时,NR==FNR才有意义,如果这个值为true,表示还在处理第一个文件。

    NR==FNR 這個一般用於讀取兩個或者兩個以上的文件中,用於判斷是在讀取第一個文件。。

    test.txt   10行内容

    test2.txt    4行内容

    awk '{print NR,FNR}' test.txt test2.txt
    1 1
    2 2
    3 3
    4 4
    5 5
    6 6
    7 7
    8 8
    9 9
    10 10
    11 1
    12 2
    13 3
    14 4

     

    现在有两个文件格式如下:

    #cat account
    张三|000001
    李四|000002
    #cat cdr
    000001|10
    000001|20
    000002|30
    000002|15

    想要得到的结果是将用户名,帐号和金额在同一行打印出来,如下:

    张三|000001|10
    张三|000001|20
    李四|000002|30
    李四|000002|15

    执行如下代码

    #awk -F \| 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}' account cdr

    注释:

    由NR=FNR为真时,判断当前读入的是第一个文件account,然后使用{a[$2]=$0;next}循环将account文件的每行记录都存入数组a,并使用$2第2个字段作为下标引用.

    由NR=FNR为假时,判断当前读入了第二个文件cdr,然后跳过{a[$2]=$0;next},对第二个文件cdr的每一行都无条件执行 {print a[$1]"|"$2},此时变量$1为第二个文件的第一个字段,与读入第一个文件时,采用第一个文件第二个字段$2为数组下标相同.因此可以在此使用 a[$1]引用数组。

     

     

    awk '{gsub(/\$/,"");gsub(/,/,"");
    if ($1>=0.1 && $1<0.2) c1+=1;
    else if ($1>=0.2 && $1<0.3) c2+=1;
    else if ($1>=0.3 && $1<0.4) c3+=1;
    else if ($1>=0.4 && $1<0.5) c4+=1;
    else if ($1>=0.5 && $1<0.6) c5+=1;
    else if ($1>=0.6 && $1<0.7) c6+=1;
    else if ($1>=0.7 && $1<0.8) c7+=1;
    else if ($1>=0.8 && $1<0.9) c8+=1;
    else if ($1>=0.9 ) c9+=1;
    else c10+=1; }
    END {printf  "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t",c1,c2,c3,c4,c5,c6,c7,c8,c9,c10} ' /NEW

     

    示例/例子

    awk '{if($0~/^>.*$/) {tmp=$0; getline; if( length($0)>=200) {print  tmp"\n"$0; } }}'  filename

    awk '{if($0~/^>.*$/) {IGNORECASE=1; if($0~/PREDICTED/) {getline;} else {print $0; getline;  print $0; } }}' filename

    awk '{if($0~/^>.*$/) {IGNORECASE=1; if($0~/mRNA/) {print $0; getline;  print $0; } else {getline;} }}'  filename

    awk '{ temp=$0; getline; if($0~/unavailable/) {;} else {print temp"\n"$0;} }' filename

     

    substr($4,20)     --->  表示是从第4个字段里的第20个字符开始,一直到设定的分隔符","结束.

    substr($3,12,8)  --->  表示是从第3个字段里的第12个字符开始,截取8个字符结束.

     

    一、awk字符串转数字
    $ awk 'BEGIN{a="100";b="10test10";print (a+b+0);}' 
    110 
    只需要将变量通过”+”连接运算。自动强制将字符串转为整型。非数字变成0,发现第一个非数字字符,后面自动忽略。 
    二、awk数字转为字符串 
    $ awk 'BEGIN{a=100;b=100;c=(a""b);print c}'      
    100100 
    只需要将变量与””符号连接起来运算即可。 
    三、awk字符串连接操作(字符串连接;链接;串联) 
    $ awk 'BEGIN{a="a";b="b";c=(a""b);print c}'      
    ab 
    $ awk 'BEGIN{a="a";b="b";c=(a+b);print c}'  
    0

     

    把文件中的各行串联起来:

    awk 'BEGIN{xxxx="";}{xxxx=(xxxx""$0);}END{print xxxx}' temp.txt
    awk 'BEGIN{xxxx="";}{xxxx=(xxxx"\",\""$0);}END{print xxxx}' temp.txt
     

    提取满足条件的子字符串:

     cat > temp
    74938 A>G 347589B>C43795743
     

    awk '{x=$0;while (match(x, "[A-Z]>[A-Z]") > 0) {  print substr(x, RSTART, RLENGTH);  x = substr(x, RSTART+RLENGTH);} }' temp

     

    awk字符串函数,包含使用示例:

    https://www.tutorialspoint.com/awk/awk_string_functions.htm

    https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html

     

    分类: [33]Linux/Unix,[30]Shell

     

     

     

    转载于:https://my.oschina.net/u/3912766/blog/1931171

    展开全文
  • 正则(2)

    2018-08-22 21:47:24
    sed在某一行最后添加一个数字 删除某行最后一行 打印1100行含某个字符串的行 awk 中使用外部shell变量 awk 合并一个文件 把一个文件多行连接成一行 awk中gsub函数的使用 awk 截取指定多个域为一行 过滤...
  • 14、合并:普通合并,就是正常的多个文本文件进行合并,按照行的合并,第一个文件的最后一行,和第二个文件第一行不在同一行,是两个连续的行。以此类推。(好像是废话) 15、合并+数据:多个文件合并的时候直接添加...
  • html入门放弃笔记

    2018-05-15 15:06:12
    一行内允许显示多个元素的,称为 "行内元素" span,i,b,s,u,sup,sub 作用:包裹文本,并处理文本的表现形式 2、块级元素 每个元素独占一行显示的,称为 "块级元素" div,p,h1,h2,h3,h4,h5,h6 作用:布局 ...
  • PilotEdit Lite v12.7.0.zip

    2019-07-13 07:37:32
    如果粘贴一行文字,这行文字将被插入列模式中所有选中的行 如果粘贴多行文字,这些文字将被逐行被插入列模式中选中的行 6. 无限的undo/redo 在十六进制编辑模式和文本模式切换后仍然可以无限次地undo/redo 7...
  • EXCEL

    2021-01-18 23:53:13
    底端加入多张工作表并且修改颜色 选择与全选-ctrl+方向可快速跳转该方向末端最后个。ctrl+shift+方向键可快速选取该方向所有... 多行都需要合并单元格选择-跨越合并 文本格式-防止数字被省略或变成科学计数法 页
  •  >如果粘贴一行文字,这行文字将被插入列模式中所有选中的行  >如果粘贴多行文字,这些文字将被逐行被插入列模式中选中的行  6、无限的undo/redo  >在十六进制编辑模式和文本模式切换后仍然可以无限次地...
  • >如果粘贴一行文字,这行文字将被插入列模式中所有选中的行 >如果粘贴多行文字,这些文字将被逐行被插入列模式中选中的行 6. 无限的undo/redo >在十六进制编辑模式和文本模式切换后仍然可以无限次地undo/redo 7....
  •  >如果粘贴一行文字,这行文字将被插入列模式中所有选中的行  >如果粘贴多行文字,这些文字将被逐行被插入列模式中选中的行  6、无限的undo/redo  >在十六进制编辑模式和文本模式切换后仍然可以无限次地...
  •  实例033 制作数字猜猜看小游戏 40 实例034 使用goto语句在数组中搜索指定图书 42 第3章 字符串处理技术 44 3.1 字符及字符串转换 45  实例035 将字母全部转换为大写或小写 45  实例036 字母与ASCII...
  • 25.多行合并一行 26.将多个文档按列合并 27.在每行首添加时间标记 28.不做改动重新保存 29.批量提取电子邮件地址 30.用源文件行内容添加目标中来 31.批量递增替换特定内容 32.批量删除文档中的日期时间 ...
  • 可能你已经注意,变量都有个美元符号($)的前缀。所有变量都是局部变量,为了使得定义的函数中可以使用外部变量,使用global语句。而你要将该变量的作用范围限制在该函数之内,使用static语句。 $g_var = 1 ; /...
  • 25.多行合并一行 26.将多个文档按列合并 27.在每行首添加时间标记 28.不做改动重新保存 29.批量提取电子邮件地址 30.用源文件行内容添加目标中来 31.批量递增替换特定内容 32.批量删除文档中的日期时间 33.批量...
  • excel使用小技巧.docx

    2020-07-10 12:15:58
    1. 多行多列数据如何快速求和。使用alt + = 例如:知道湖北,湖南,河南,江西1-12...6. 如何快速拆分日期,第一行输入然后下一行按CTRL+E 如:开始结束日期输入在一个单元格中,拆分成开始日期和结束日期两个单元格
  • 用连字符“&”来合并文本怎样把不同格式不同位置的内容合并到一个单元格内 把不同单元格的内容合到一个单元格里 合并与拆分 合并不同单元格的内容 关于文字在表格中的组合 求拆解合并公式 如何把字母和数字分开? 把...
  • EXCEL函数公式集

    热门讨论 2010-03-16 03:26:38
    用连字符“&”来合并文本怎样把不同格式不同位置的内容合并到一个单元格内 把不同单元格的内容合到一个单元格里 合并与拆分 合并不同单元格的内容 关于文字在表格中的组合 求拆解合并公式 如何把字母和数字分开? 把...
  • Ctrl+J 合并行(已选择需要合并多行时) Ctrl+KU 改为大写 Ctrl+KL 改为小写 Ctrl+D 选择字符串 (按住-继续选择下个相同的字符串) Ctrl+M 光标移动至括号内开始或结束的位置 Ctrl+/ 注释整行(如已选择内容,同...
  • 合并到选区】:将一个单元格的值合到一个区域中去,可以插入到原字符之前也可以插入到原字符之后 【可还原的合并居中】:合并数据时可以保留所有数据,可以随心所欲定义分隔符。还可以随时取消合并,还原所有...
  • 合并到选区】:将一个单元格的值合到一个区域中去,可以插入到原字符之前也可以插入到原字符之后 【可还原的合并居中】:合并数据时可以保留所有数据,可以随心所欲定义分隔符。还可以随时取消合并,还原所有数据 ...
  • 合并到选区】将一个单元格的值合到一个区域中去,可以插入到原字符之前也可以插入到原字符之后 【可还原的合并居中】合并居中数据,可以保留合并前的所有数据。而且取消合并后可以还原数据,强过Excel自带的合并 ...
  • 然后经过抽取、转换、装载合并到一个企业级的数据仓库里, 从而得到企业数据的一个全局视图,并在此基础上利用适当 的查询分析、数据挖掘、OLAP等技术工具对其进行分析处理, 最终将知识呈现给管理者,为管理者的...
  • Excel新增工具集

    2011-12-20 09:30:27
    (b)需要合并到一个单元格的数据为文本时用“/”号隔开,数据为数值通过求和合并到一个单元格中。例如,当前工作表或当前工作簿中的若干工作表中A列有张三、李四、王五、李四,有相同列字段“送货”,则本命令把A列...
  • Ctrl+J 合并行(已选择需要合并多行时) Ctrl+KU 改为大写 Ctrl+KL 改为小写 Ctrl+D 选择字符串 (按住-继续选择下个相同的字符串) Ctrl+M 光标移动至括号内开始或结束的位置 Ctrl+/ 注释整行(如已选择内容,同...
  • 百宝箱4.0简体2003

    2008-09-24 15:15:30
    产生不重复随机数 产生1指定数字的不重复随机数,轻松解决函数版常用问题。 消除区域重复值 将选区中重复值删除,仅留下唯一值。支持多行单列及多行多列。 建立底端标题 EXCEL顶端标题的延伸。可以使1至6底端...
  • 面试题3:二维数组中的查找:对于在一个每一行从左右依次递增,每一列从上下依次递增的二维数组查找一个元素,可以选择从数组左上角开始查找array[i][j],如果目标元素大于array[i][j],i+=1,如果元素小于array...
  • 最大的优点是将指定的任意区域按每个存储格内容为一行加入当前批注中,允许批注内容中是否显示行号。 【连接字符串】 可视化地窗体连接字符串功能。能将最多三个任意区域存储格(或列)的内容按自定的分隔符号...
  • Excel百宝箱

    2012-10-27 17:09:21
    合并到选区】:将一个单元格的值合到一个区域中去,可以插入到原字符之前也可以插入到原字符之后 【可还原的合并居中】:合并数据时可以保留所有数据,可以随心所欲定义分隔符。还可以随时取消合并,还原所有数据 ...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 146
精华内容 58
关键字:

多行数字合并到一行