我试图了解程序,shell命令和操作系统的工作原理.请原谅我的无知,因为我是新手.
当我在命令行上使用C编译器时,当我输入cc [filename]时,我认为shell使用fork()系统调用来复制其进程,然后exec()系统调用将cc编译器可执行文件加载到儿童过程的核心形象.然后,包含cc可执行文件的子进程将执行其操作,而执行shell的父进程是否等待.这样对吗?
那些shell命令如cp,mv,ls等等.这些是什么?它们是可执行程序,也将在shell分叉的新子进程中执行吗?shell脚本怎么样?假设我创建了一个像这样的简单shell脚本(请忽略任何我不知道如何执行此操作的错误):
echo "Hello"
date
echo
cc -o test file1.c file2.c file3.c
Run Code Online (Sandbox Code Playgroud)
然后我使用命令行执行此脚本.请问命令行fork()一个新进程和exec()这个脚本在新进程中?然后这个新进程会包含脚本fork()其他进程来执行date,cc编译器等吗?
我希望这听起来不会太混乱,因为我= /.
我有一个文件Query.txt与这样的数据:
# Query: Name_ID
# 2 hits found****
# Query: Name_ID
# 20 hits found
# Query: Name_ID
# 0 hits found
Run Code Online (Sandbox Code Playgroud)
当我把它弄糟或grep它为一个模式我得到如下输出:
grep "0 hits found" Query.txt | head
# 20 hits found
# 0 hits found
# 140 hits found
# 70 hits found
Run Code Online (Sandbox Code Playgroud)
两个问题:我如何专门得到"0次点击"而不是20或140或70?第二,如何使用AWK创建另一个文件Query2.txt,格式如下?
# Query: Name_ID # 2 hits found
# Query: Name_ID # 20 hits found
# Query: Name_ID # 0 hits found
Run Code Online (Sandbox Code Playgroud) 看来,awk脚本考虑ARGV[1]到ARGV[ARGC]作为输入文件.
有没有办法让awk考虑ARGV作为简单的参数而不是输入文件
例:
test.awk
#!/usr/bin/awk -f
BEGIN {title=ARGV[2]}
{if ($1=="AA") {print title}}
Run Code Online (Sandbox Code Playgroud)
dat文件
AB
BA
AA
CC
$ test.awk dat 'My Interesting Title'
Run Code Online (Sandbox Code Playgroud)
我有趣的标题awk:test.awk:3:致命:无法打开文件"我有趣的标题"进行阅读(没有这样的文件或目录)
我正在尝试将单词“dicom”附加到一组文件夹中的许多文件名的前面。这些文件夹均以“s”开头(在下面的脚本中由“s*”引用),每个文件夹都包含许多文件(由下面的“*”指定)——我希望使用此命令更改所有这些文件bash 脚本。我尝试运行这个:
for file in /Volumes/USB_AIB/DICOMFunCurrentBatch/MOVr1unzip/s*/*
do
mv $file dicom${file%%}
done
Run Code Online (Sandbox Code Playgroud)
但出现了数千行以下错误(每个文件夹中的每个文件一次 - 这只是其中之一的示例):
mv: rename /Volumes/USB_AIB/DICOMFunCurrentBatch/MOVr1unzip/s307_1/29217684 to dicom/Volumes/USB_AIB/DICOMFunCurrentBatch/MOVr1unzip/s307_1/29217684: No such file or directory
Run Code Online (Sandbox Code Playgroud)
关于如何修复它有什么想法吗?
最近,我一直在对 8x8 图像数据块进行大量处理。标准方法是使用嵌套的 for 循环来提取块,例如
for y in xrange(0,height,8):
for x in xrange(0,width,8):
d = image_data[y:y+8,x:x+8]
# further processing on the 8x8-block
Run Code Online (Sandbox Code Playgroud)
我不禁想知道是否有一种方法可以使用 numpy/scipy 来矢量化此操作或另一种方法,我可以使用它来代替?某种迭代器?
MWE 1:
#!/usr/bin/env python
import sys
import numpy as np
from scipy.fftpack import dct, idct
import scipy.misc
import matplotlib.pyplot as plt
def dctdemo(coeffs=1):
unzig = np.array([
0, 1, 8, 16, 9, 2, 3, 10,
17, 24, 32, 25, 18, 11, 4, 5,
12, 19, 26, 33, 40, 48, 41, 34,
27, 20, 13, 6, …Run Code Online (Sandbox Code Playgroud) 我试图读取任何文件类型结尾的文件,并确定它是否为十六进制值,如果它是一个PNG文件.
到目前为止,我已尝试过两条不同的路径,但没有一条路在工作
码:
int IS_PNG_FILE(char *name)
{
FILE *dat = fopen (name, "rt");
if (dat == NULL) return 1;
int data_point;
char buf[16], a[16];
fgets(buf, 16, dat);
printf("%s\n", buf);
int i, b;
for (i=0; i<16; i++)
{
sscanf(&buf[i], "%2x", &b);
a[i] = b;
i += 2;
}
printf("%d\n", a);
fscanf(dat, "%2x", &data_point);
printf("%d\n", data_point);
fclose(dat);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 运行if else语句时,我不断收到意外的文件结尾错误
#! /bin/bash
echo -e "1: Proband\n 2: mincount\n Enter an option:"
read promin
echo $promin
if ($promin == 1) then
echo -e "Enter the proband file name\n"
read proband_file
echo "$proband_file"
endif
if ($promin == 2) then
echo -e "enter the min count number\n"
read mincount
echo "$mincount mincount"
endif
Run Code Online (Sandbox Code Playgroud)
我也尝试了fi而不是elseif。但是我仍然遇到同样的错误。有人可以帮我解决这个问题吗?
我有一个非常有趣的问题,在我的下面的bash脚本中,for循环以某种方式在300循环之后总是停止(我有时需要它执行超过600).
#!/bin/bash
for i in `seq $1 $2`;
do
composite $i".png" $i"_temp.png" $i"_out.png"
done
Run Code Online (Sandbox Code Playgroud)
我在使用超过300个循环的其他语言中运行相同的命令时没有遇到任何问题.我不知道bash会发生什么.
另外,我注意到在第300次循环之后,脚本不会退出,而是"暂停".
我目前正在使用解决方法来解决此问题,方法是将脚本从1运行到250,然后从251运行到500,等等.
我正在研究一个bash脚本,其中ipset(一个iptables扩展)要求CIDR格式化的条目将"[single space] \"附加到每个CIDR行的末尾以输入到集合中.例如,文件中的一些随机条目应如下所示:
175.30.0.0/15 \
175.42.0.0/15 \
175.76.0.0/15
Run Code Online (Sandbox Code Playgroud)
没有a的最后一行\表示列表的结尾.使用sed或任何其他方法,什么是最简单的方法来附加此符号和它之前的空间?是否有合理的方法来编写条件以省略最后一个斜杠?
请看下面的输出:
SubNetwork=ONRM_ROOT_MO_R,SubNetwork=IPRAN,MeContext=U207@10.218.131.141@5.5@15@ON@3@5@STN_NODE_MODEL@1389599874171@1389599874171
SubNetwork=ONRM_ROOT_MO_R,SubNetwork=IPRAN,MeContext=U201@10.218.132.161@5.8@15@ON@1@4@STN_NODE_MODEL@-1@-1
Run Code Online (Sandbox Code Playgroud)
包含多行的文件,如上所示.如果您可以看到上面的不同字段用"@"符号分隔.我的目的是在第5次出现"@"符号后选择所有那些数字为"3"的行.
与上面的输出一样,结果应如下所示.因为在@符号出现五次之后它有3号.
SubNetwork=ONRM_ROOT_MO_R,SubNetwork=IPRAN,MeContext=U207@10.218.131.141@5.5@15@ON@3@5@STN_NODE_MODEL@1389599874171@1389599874171
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有这样的数据:
1;2015-04-10;23:10:00;10.4.2015 23:10;8.9;1007.5;0.3;0.0;0;55
2;2015-04-10;23:20:00;10.4.2015 23:20;8.6;1007.8;0.4;0.0;0;56
3;2015-04-10;23:30:00;10.4.2015 23:30;8.5;1008.1;0.4;0.0;0;57
Run Code Online (Sandbox Code Playgroud)
它有点.作为小数分隔符,但我需要使用,.
所需数据:
1;2015-04-10;23:10:00;10.4.2015 23:10;8,9;1007,5;0,3;0,0;0;55
Run Code Online (Sandbox Code Playgroud)
我试过用Sed.随着sed -i 's/\./,/g' myfile.csv我可以代替用逗号分隔的所有点,但会破坏对第四列的日期.如何在其他地方将点更改为逗号,但保留第四列原样?如果某个其他Linux工具对于此任务更好,那么Sed我也可以使用它.
如何在pattern1和pattern2之间打印线条,我不需要pattern1和pattern3之间的线条.
请以sed,awk建议解决方案.
我有这样的情况.
pattern1
blah blah blah
blah blah blah
blah blah blah
pattern2
pattern1
blah blah blah
blah blah blah
pattern3
pattern1
blah blah blah
blah blah blah
pattern2
pattern1
blah blah blah
blah blah blah
pattern3
Run Code Online (Sandbox Code Playgroud)
欲望输出:
pattern1
blah blah blah
blah blah blah
blah blah blah
pattern2
pattern1
blah blah blah
blah blah blah
pattern2
Run Code Online (Sandbox Code Playgroud) awk ×6
bash ×4
shell ×4
linux ×3
sed ×3
c ×1
csv ×1
end-of-life ×1
executable ×1
filenames ×1
grep ×1
hex ×1
if-statement ×1
numpy ×1
perl ×1
png ×1
python ×1
regex ×1
scipy ×1
system-calls ×1