我们似乎看到越来越多有关在 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 上执行此操作?
如何使用多行命令输出填充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) 我有一个像这样的文件:
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) 假设我有一个文件 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 中的函数发送多个参数。我怎样才能做到这一点,以便函数正确解析每个参数?
如果可能的话希望避免使用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)
我尝试将参数以不同的顺序放置,并使用引号和不使用引号,我尝试过的似乎都不起作用。如何将多个参数传递给函数?
我正试图从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) 我有一个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.
谢谢.
春
我有一个非常重复的文本文件,前几行看起来像这样:
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) 我在 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)
我试图摆脱起始数字。
我面临的问题是;
谁能帮我一个简单的解决方案来删除每行开头的所有数字,而不影响该行的其余部分?
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,我很想念,或者一些第三方工具,允许组合这两个触发器的语义和情境线?