小编Ed *_*ton的帖子

如何在 cygwin 下使用 awk 打印 Excel 电子表格中的字段?

我们似乎看到越来越多有关在 Excel 电子表格上执行 awk 的问题,因此这里有一个关于如何执行该特定操作的问答。

我在 Excel 电子表格中包含此信息"$D/staff.xlsx"(其中"$D"是我的桌面的路径):

Name   Position
Sue    Manager
Bill   Secretary
Pat    Engineer
Run Code Online (Sandbox Code Playgroud)

我想打印给定名称的位置字段,例如Secretary给定输入的输出Bill

我目前可以从 Excel 保存为 CSV 以获得:

$ cat "$D/staff.csv"
Name,Position
Sue,Manager
Bill,Secretary
Pat,Engineer
Run Code Online (Sandbox Code Playgroud)

然后运行:

$ awk -F, -v name="Bill" '$1==name{print $2}' "$D/staff.csv"
Secretary
Run Code Online (Sandbox Code Playgroud)

但这只是更大任务的一小部分,因此我必须能够从 shell 脚本自动执行此操作,而无需手动打开 Excel 导出 CSV 文件。如何在运行 cygwin 的 Windows PC 上执行此操作?

csv vbscript excel awk cygwin

2
推荐指数
1
解决办法
1172
查看次数

如何使用多行命令输出填充bash数组?

如何使用多行命令输出填充bash数组?

例如,给出这个printf命令:

$ printf 'a\nb\n\nc\n\nd\ne\nf\n\n'
a
b

c

d
e
f
Run Code Online (Sandbox Code Playgroud)

我想填充一个bash数组,好像我写的:

$ arr[0]='a
b'
$ arr[1]='c'
$ arr[2]='d
e
f'
Run Code Online (Sandbox Code Playgroud)

所以可以循环通过它:

$ for i in "${arr[@]}"; do printf "<%s>\n" "$i"; done
<a
b>
<c>
<d
e
f>
Run Code Online (Sandbox Code Playgroud)

我尝试过各种使用NUL字符来分隔我想要的数组字段而不是空白行的化身,因为这似乎是我最好的选择但到目前为止没有运气,例如:

$ IFS=$'\0' declare -a arr="( $(printf 'a\nb\n\0c\n\0d\ne\nf\n\0') )"
$ for i in "${arr[@]}"; do printf "<%s>\n" "$i"; done
<a>
<b>
<c>
<d>
<e>
<f>
Run Code Online (Sandbox Code Playgroud)

我也试过mapfile -d $'\0'但我的mapfile不支持-d.

我确实发现这有效:

$ declare -a arr="( $(printf '"a\nb" "c" "d\ne\nf"') )" …
Run Code Online (Sandbox Code Playgroud)

bash

2
推荐指数
1
解决办法
572
查看次数

使用sed进行数据转换

我有一个像这样的文件:

A
B
C
D

E
F
G
H

I
J
K
L
Run Code Online (Sandbox Code Playgroud)

我希望它能像它一样出现

A,B,C,D
E,F,G,H
Run Code Online (Sandbox Code Playgroud)

我假设我会使用sed,但实际上我甚至不确定这是否是最好的工具.我愿意使用Linux系统上常用的任何东西.

perl,我这样做了......它有效,但它很脏,有一个尾随的逗号.希望更简单的事情:

$ perl -ne 'if (/^(\w)\R/) {print "$1,";} else {print "\n";}' test
A,B,C,D,
E,F,G,H,
I,J,K,L,    
Run Code Online (Sandbox Code Playgroud)

perl awk sed

2
推荐指数
1
解决办法
85
查看次数

如何通过给定 Linux 中花药文件中的列来从文件中删除列?

假设我有一个文件 A 包含需要删除的列号(我的输入文件 fileB 中确实有超过 500 列),

文件A:

2
5
Run Code Online (Sandbox Code Playgroud)

我想从 fileB 中删除这些列(2 和 5):

a b c d e f
g h i j k l
Run Code Online (Sandbox Code Playgroud)

在Linux中获取:

a c d f
g i j l
Run Code Online (Sandbox Code Playgroud)

我应该怎么办?我发现我可以消除使用代码打印这些列:

awk '{$2=$5="";print $0}' fileB
Run Code Online (Sandbox Code Playgroud)

但是,这种方式有两个问题,首先它并没有真正删除这些列,它只是使用空字符串来替换它们;其次,我如何通过从另一个文件读取来获取这些列号,而不是手动输入这些列号。


原始问题:假设我有一个文件 A 包含需要删除的列号,

文件A:

223
345
346
567

我想从 Linux 中的文件 B 中删除这些列(223, 345,567),我该怎么办?

bash awk

2
推荐指数
1
解决办法
130
查看次数

bash 如何切换传递给函数的初始参数

我想向 bash 中的函数发送多个参数。我怎样才能做到这一点,以便函数正确解析每个参数?

如果可能的话希望避免使用eval

这是我尝试使用的代码。

#!/bin/bash

arr_files=(
test_file
test_file1
test_file2
)

user=user10
group=user10

cp_chmod_chown(){
    # $1 = chmod value
    # $2 = chown value
    # $3 = array of files

    chmod_value=$1
    shift
    chown_value=$2
    shift
    arr=("$@")
 
    for i in "${arr[@]}"; do
        echo arr value: $i
    done
    echo chmod_value: $chmod_value
    echo chown_value: $chown_value

}

cp_chmod_chown "644" "$user:$group" "${arr_files[@]}"


Run Code Online (Sandbox Code Playgroud)

但是,我无法正确移出前两个参数,因此参数在数组中混杂在一起。这是运行上述脚本后的输出,您可以看到chown_value由于某种原因是数组中的第一个值:

# ./cp_arra_chmod_chown.sh

arr value: test_file
arr value: test_file1
arr value: test_file2
chmod_value: 644
chown_value: test_file

Run Code Online (Sandbox Code Playgroud)

我尝试将参数以不同的顺序放置,并使用引号和不使用引号,我尝试过的似乎都不起作用。如何将多个参数传递给函数?

arrays parameters bash function

2
推荐指数
1
解决办法
1554
查看次数

带正则表达式的Grep返回所有内容

我正试图从linux命令"passwd"获取日期.我正在做什么,我将用户存储在数组@user中,我想在每个用户上运行命令"passwd -S".当ii运行"passwd -S user1"时,它返回:

user PS 2016-02-16 0 99999 7 -1 (Password set, SHA512 crypt.)
Run Code Online (Sandbox Code Playgroud)

我想出了一个正则表达式,只从该字符串中获取日期,正则表达式如下所示:'

\d{4}-\d{2}-\d{2}
Run Code Online (Sandbox Code Playgroud)

但是当我将它与grep结合起来时,我似乎无法使它工作,它仍然输出"passwd"命令的完整输出.这是代码:

PasswordAge();

sub PasswordAge {
    for my $loop (@user) {
        my $pass =qx(passwd -S $loop);
        my @splitpass = grep {/\d{4}-\d{2}-\d{2}/} $pass;
        print @splitpass;
    }
}
Run Code Online (Sandbox Code Playgroud)

regex perl

1
推荐指数
1
解决办法
156
查看次数

在perl脚本中使用grep

我有一个perl脚本,例如:


    #!/usr/bin/perl -w

    use strict;

    my @vars = split(" ", "aaa bbb");
    my @list = split(" ", "aaa");

    foreach(@vars) {
        if ( grep(/$_/, @list)) {
            print "1\t";
        }else{
            print "0\t";
        }
    }

我希望它能给出"1 0"作为回报,但总是"1 1".有谁知道为什么?我使用的是perl 5.8.8.

谢谢.

perl

1
推荐指数
1
解决办法
249
查看次数

使用R中的grep(?)删除文本文件中的行

我有一个非常重复的文本文件,前几行看起来像这样:

Filename: 
ROI: red_1 [Red] 20 points

Basic Stats      Min         Max        Mean       Stdev
     Band 1 0.013282    0.133982    0.061581    0.034069
     Band 2 0.009866    0.112935    0.042688    0.026618
     Band 3 0.008304    0.037059    0.018434    0.007515
     Band 4 0.004726    0.040089    0.018490    0.009605

Histogram         DN       Npts   Total  Percent     Acc Pct
Band 1      0.013282          1       1   5.0000      5.0000
Bin=0.00047 0.013755          0       1   0.0000      5.0000
            0.014228          0       1   0.0000      5.0000
Run Code Online (Sandbox Code Playgroud)

..并持续一段时间,直到达到另一个ROI值,如下所示:

Stats for ROI: red_5 [Red] 20 points
Basic Stats      Min         Max        Mean       Stdev
     Band 1 0.030513    0.180980 …
Run Code Online (Sandbox Code Playgroud)

r dataframe data-cleaning

1
推荐指数
1
解决办法
291
查看次数

从bash中的每一行中删除第一个数字(1-2个字符长度)

我在 bash 中使用 jq 命令从 json 读取数据。我采用的字段之一会产生这样的数据;

[
  "0local>aggr.tasks.max = 128",
  "1local>aggr.tasks.max = 128",
  "2local->aggi.tasks.max = 128",
  "3local>aggr.fetch.max.wait.ms = 150",
  "4local>aggr.fetch.max.wait.ms = 150",
  "5local->aggr.fetch.max.wait.ms = 150",
  "6local->aggr.fetch.min.bytes = 10485760",
  "7local>aggr-fetch.min.bytes = 10485760",
  "8local>aggr-fetch.min.bytes = 10485760",
  "9local->aggr.fetch.max.bytes = 52428800",
  "10local->aggr.fetch.max.bytes = 52428800",
  "11local->aggr.fetch.max.bytes = 52428800",
  "12local->aggr.max.request.size = 10485760",
  "13local->aggr-max.request.size = 10485760",
  "14local->aggr-max.request.size = 10485760"
]
Run Code Online (Sandbox Code Playgroud)

我试图摆脱起始数字。

我面临的问题是;

  1. 如果我使用 sed 删除第一个数字,一旦达到 10,我就会遇到问题,因为现在我有 2 个数字
  2. 如果我尝试删除所有数字,我也会删除每一行的值

谁能帮我一个简单的解决方案来删除每行开头的所有数字,而不影响该行的其余部分?

bash json jq

1
推荐指数
1
解决办法
80
查看次数

grep 与“从这个到那个”触发器语义?

grep允许通过使用看到匹配的上下文-A-B-C选项,例如

grep -B 3 -A 10 "WARNING" MyApp.log 
Run Code Online (Sandbox Code Playgroud)

perl one-liners 允许轻松提取文本,即在开始和结束行之间,每个文本匹配不同的正则表达式,使用形式中的双稳态翻转运算符

perl -ne '(/^WARNING/../^$/) && print' MyApp.log
Run Code Online (Sandbox Code Playgroud)

但是除了编写更复杂的脚本之外,没有明显的方法来包含上下文行 - 绝对不是在命令行上快速使用的临时解决方案。

是否有一些功能grep/ perl,我很想念,或者一些第三方工具,允许组合这两个触发器的语义和情境线?

perl awk grep

1
推荐指数
1
解决办法
89
查看次数

标签 统计

awk ×4

bash ×4

perl ×4

arrays ×1

csv ×1

cygwin ×1

data-cleaning ×1

dataframe ×1

excel ×1

function ×1

grep ×1

jq ×1

json ×1

parameters ×1

r ×1

regex ×1

sed ×1

vbscript ×1